±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½²½âJVM½á¹¹Í¼
£¬ClassLoader£¬Ö´ÐÐÒýÇæ£¬Runtime DataArea£¬±¾µØ·½·¨Õ»£¬Ï£Íû¶ÔÄúÄÜÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚcsdn£¬ÓÉ»ðÁú¹ûÈí¼þDelores±à¼ÍƼö |
|
JavaÐéÄâ»ú£¨Java virtualmachine£©ÊµÏÖÁËJavaÓïÑÔ×îÖØÒªµÄÌØÕ÷£º¼´Æ½Ì¨ÎÞ¹ØÐÔ¡£
ƽ̨ÎÞ¹ØÐÔÔÀí£º±àÒëºóµÄJava³ÌÐò£¨.classÎļþ£©ÓÉJVMÖ´ÐС£JVMÆÁ±ÎÁËÓë¾ßÌåÆ½Ì¨Ïà¹ØµÄÐÅÏ¢£¬Ê¹³ÌÐò¿ÉÒÔÔÚ¶àÖÖÆ½Ì¨Éϲ»¼ÓÐ޸ĵØÔËÐС£JavaÐéÄâ»úÔÚÖ´ÐÐ×Ö½ÚÂëʱ£¬°Ñ×Ö½ÚÂë½âÊͳɾßÌåÆ½Ì¨ÉϵĻúÆ÷Ö¸ÁîÖ´ÐС£Òò´ËʵÏÖJavaƽ̨ÎÞ¹ØÐÔ¡£
1. JVM½á¹¹Í¼

JVM =Àà¼ÓÔØÆ÷classloader +Ö´ÐÐÒýÇæexecutionengine +ÔËÐÐʱÊý¾ÝÇøÓòruntime data area
Ê×ÏÈJavaÔ´´úÂëÎļþ±»Java±àÒëÆ÷±àÒëΪ×Ö½ÚÂëÎļþ£¬È»ºóJVMÖеÄÀà¼ÓÔØÆ÷¼ÓÔØÍê±ÏÖ®ºó£¬½»ÓÉJVMÖ´ÐÐÒýÇæÖ´ÐС£ÔÚÕû¸ö³ÌÐòÖ´Ðйý³ÌÖУ¬JVMÖеÄÔËÐÐʱÊý¾ÝÇø£¨Äڴ棩»áÓÃÀ´´æ´¢³ÌÐòÖ´ÐÐÆÚ¼äÐèÒªÓõ½µÄÊý¾ÝºÍÏà¹ØÐÅÏ¢¡£
Òò´Ë£¬ÔÚJavaÖÐÎÒÃdz£³£Ëµµ½µÄÄÚ´æ¹ÜÀí¾ÍÊÇÕë¶ÔÕâ¶Î¿Õ¼ä½øÐйÜÀí£¨ÈçºÎ·ÖÅäºÍ»ØÊÕÄÚ´æ¿Õ¼ä£©¡£
2. ClassLoader
Classloader°ÑÓ²ÅÌÉϵÄclassÎļþ¼ÓÔØµ½JVMÖеÄÔËÐÐʱÊý¾ÝÇøÓò£¬µ«ÊÇËü²»¸ºÔðÕâ¸öÀàÎļþÄÜ·ñÖ´ÐУ¬¶øÕâ¸öÊÇÖ´ÐÐÒýÇæ¸ºÔðµÄ¡£
ÏÞÓÚÆª·ù£¬Àà¼ÓÔØÆ÷µÄ×éÖ¯½á¹¹£¬¼ÓÔØÀàµÄ»úÖÆÔÀíµÈ»áÔÚJVM¡ª¡ªÀà¼ÓÔØÆ÷×ܽáÒ»ÎÄÖÐÃèÊö¡£
Ë«Ç×ίÅÉÄ£ÐÍÒÔ¼°×Ô¶¨ÒåÀà¼ÓÔØÆ÷»áÔÚJVM¡ª¡ª×Ô¶¨ÒåÀà¼ÓÔØÆ÷Ò»ÎÄÖÐÃèÊö¡£
3. Ö´ÐÐÒýÇæ
×÷ÓãºÖ´ÐÐ×Ö½ÚÂ룬»òÕßÖ´Ðб¾µØ·½·¨¡£
4. Runtime DataArea
JVMÔÚÔËÐÐÆÚ¼ä£¬ÔÚÔËÐÐʱÊý¾ÝÇø¶ÔJVMÄÚ´æ¿Õ¼äµÄ»®·ÖºÍ·ÖÅ䣬»®·ÖΪÁËÒÔϼ¸¸öÇøÓòÀ´´æ´¢¡£

£¨Í¼×¢£ºJDK1.7ÒѾ°Ñ³£Á¿³Ø×ªÒƵ½¶ÑÀïÃæÁË£¡£©
PC¼ÆÊýÆ÷£¨The PCRegister£©
£¨1£©Ã¿Ò»¸öJavaÏ̶߳¼ÓÐÒ»¸öPC¼Ä´æÆ÷£¬ÓÃÒԼǼ±ÈÈçÔÚÏß³ÌÇл»»ØÀ´ºó»Ö¸´µ½ÕýÈ·µÄÖ´ÐÐλÖá£
£¨2£©Èç¸ÃÏß³ÌÕýÔÚÖ´ÐÐÒ»¸öJava·½·¨£¬Ôò¼ÆÊýÆ÷¼Ç¼µÄÊÇÕýÔÚÖ´ÐеÄÐéÄâ»ú×Ö½ÚÂëµØÖ·£¬ÈçÖ´ÐÐnative·½·¨£¬Ôò¼ÆÊýÆ÷ֵΪ¿Õ¡£
£¨3£©´ËÄÚ´æÇøÓòÊÇΨһһ¸öÔÚJVMÖÐûÓй涨ÈκÎOutOfMemoryErrorÇé¿öµÄÇøÓò¡£
JVMÕ»£¨Java Virtual MachineStacks£©
£¨1£©JVMÕ»ÊÇÏß³Ì˽Óе쬲¢ÇÒÉúÃüÖÜÆÚÓëÏß³ÌÏàͬ¡£²¢ÇÒµ±Ïß³ÌÔËÐÐÍê±Ïºó£¬ÏàÓ¦ÄÚ´æÒ²¾Í±»×Ô¶¯»ØÊÕ¡£
£¨2£©Õ»ÀïÃæ´æ·ÅµÄÔªËØ½ÐÕ»Ö¡£¬Ã¿¸ö·½·¨´Óµ÷Óõ½Ö´ÐнáÊø£¬ÆäʵÊǶÔÓ¦Ò»¸öÕ»Ö¡µÄÈëÕ»ºÍ³öÕ»¡£Õ»Ö¡ÓÃÓÚ´æ´¢Ö´Ðз½·¨Ê±µÄһЩÊý¾Ý£¬Èç¾Ö²¿±äÁ¿±í¡¢²Ù×÷ÊýÕ»£¨Ö´ÐÐÒýÇæ¼ÆËãʱÐèÒª£©£¬·½·¨³ö¿ÚµÈµÈ¡£
£¨3£©Õâ¸öÇøÓò¿ÉÄÜÓÐÁ½ÖÖÒì³££ºÈç¹ûÏß³ÌÇëÇóµÄÕ»Éî¶È´óÓÚÐéÄâ»úËùÔÊÐíµÄÉî¶È£¬½«Å׳öStackOverflowErrorÒì³££¨È磺½«Ò»¸öº¯Êý·´¸´µÝ¹é×Ô¼º£¬×îÖÕ»á³öÏÖÕâÖÖÒì³££©¡£Èç¹ûJVMÕ»¿ÉÒÔ¶¯Ì¬À©Õ¹£¨´ó²¿·ÖJVMÊÇ¿ÉÒԵģ©£¬µ±À©Õ¹Ê±ÎÞ·¨ÉêÇëµ½×ã¹»ÄÚ´æÔòÅ׳öOutOfMemoryErrorÒì³£¡£
±¾µØ·½·¨Õ»£¨Native Method Stacks£©
£¨1£©±¾µØ·½·¨Õ»ÓëJVMÕ»µÄ×÷ÓúÜÏàËÆ£¬ËûÃǵÄÇø±ðÔÚÓÚÐéÄâ»úÕ»ÊÇΪִÐÐJava´úÂë·½·¨·þÎñ£¬¶ø±¾µØ·½·¨Õ»ÊÇΪNative·½·¨·þÎñ¡£
£¨2£©ºÍJVMÕ»Ò»Ñù£¬Õâ¸öÇøÓòÒ²»áÅ׳öStackOverflowErrorºÍOutOfMemoryErrorÒì³£¡£
·½·¨Çø£¨Method Area£©
£¨1£©·½·¨ÇøÓòÊÇÈ«¾Ö¹²ÏíµÄ£¬±ÈÈçÿ¸öÏ̶߳¼¿ÉÒÔ·ÃÎÊͬһ¸öÀàµÄ¾²Ì¬±äÁ¿¡£ÔÚ·½·¨ÇøÖУ¬´æ´¢ÁËÒѱ»JVM¼ÓÔØµÄÀàµÄÐÅÏ¢¡¢¾²Ì¬±äÁ¿¡¢±àÒëÆ÷±àÒëºóµÄ´úÂëµÈ¡£È磬µ±³ÌÐòÖÐͨ¹ýgetName¡¢isInterfaceµÈ·½·¨À´»ñÈ¡ÐÅϢʱ£¬ÕâЩÊý¾ÝÀ´Ô´ÓÚ·½·¨Çø¡£
£¨2£©ÓÉÓÚʹÓ÷´Éä»úÖÆµÄÔÒò£¬ÐéÄâ»úºÜÄÑÍÆ²âÄĸöÀàÐÅÏ¢²»ÔÙʹÓã¬Òò´ËÕâ¿éÇøÓòµÄ»ØÊÕºÜÄÑ£¡ÁíÍ⣬¶ÔÕâ¿éÇøÓòÖ÷ÒªÊÇÕë¶Ô³£Á¿³Ø»ØÊÕ£¬ÖµµÃ×¢ÒâµÄÊÇJDK1.7ÒѾ°Ñ³£Á¿³Ø×ªÒƵ½¶ÑÀïÃæÁË¡£
£¨3£©Í¬Ñù£¬µ±·½·¨ÇøÎÞ·¨Âú×ãÄÚ´æ·ÖÅäÐèÇóʱ£¬»áÅ׳öOutOfMemoryError¡£
ÔËÐÐʱ³£Á¿³Ø£¨Runtime Constant Pool£©
£¨1£©´æ·ÅÀàÖй̶¨µÄ³£Á¿ÐÅÏ¢¡¢·½·¨ÒýÓÃÐÅÏ¢µÈ£¬Æä¿Õ¼ä´Ó·½·¨ÇøÓò£¨JDK1.7ºóΪ¶Ñ¿Õ¼ä£©ÖзÖÅä¡£
£¨2£©ClassÎļþÖгýÁËÓÐÀàµÄ°æ±¾¡¢×ֶΡ¢·½·¨¡¢½Ó¿ÚµÈÃèÊöÐÅÏ¢Í⣬»¹ÓоÍÊdz£Á¿±í£¬ÓÃÓÚ´æ·Å±àÒëÆÚÒÑ¿ÉÖªµÄ³£Á¿£¬Õⲿ·ÖÄÚÈݽ«ÔÚÀà¼ÓÔØºó½øÈë·½·¨Çø£¨ÓÀ¾Ã´ú£©´æ·Å¡£µ«ÊÇJavaÓïÑÔ²¢²»ÒªÇó³£Á¿Ò»¶¨Ö»ÓбàÒëÆÚÔ¤ÖÃÈëClassµÄ³£Á¿±íµÄÄÚÈݲÅÄܽøÈë·½·¨Çø³£Á¿³Ø£¬ÔËÐÐÆÚ¼äÒ²¿É½«ÐÂÄÚÈÝ·ÅÈë³£Á¿³Ø£¨×îµäÐ͵ÄString.intern()·½·¨£©¡£
£¨3£©µ±³£Á¿³ØÎÞ·¨ÔÚÉêÇëµ½ÄÚ´æÊ±»áÅ׳öOutOfMemoryErrorÒì³££¬ÉÏÃæÒ²·ÖÎö¹ýÁË¡£
Java¶Ñ
£¨1£©Java¶ÑÊÇJVMËù¹ÜÀíµÄ×î´óµÄÒ»¿éÄÚ´æ¡£ËüÊDZ»ËùÓÐÏ̹߳²ÏíµÄÒ»¿éÄÚ´æÇøÓò£¬ÔÚÐéÄâ»úÆô¶¯Ê±´´½¨¡£
£¨2£©¼¸ºõËùÓеÄʵÀý¶ÔÏó¶¼ÊÇÔÚÕâ¿éÇøÓòÖдæ·Å¡££¨JIT±àÒëÆ÷Ã²ËÆ²»ÊÇÕâÑùµÄ£©¡£
£¨3£©Java¶ÑÊÇÀ¬»øÊÕ¼¯¹ÜÀíµÄÖ÷ÒªÕ½³¡¡£ËùÓÐJava¶Ñ¿ÉÒÔϸ·ÖΪ£ºÐÂÉú´úºÍÀÏÄê´ú¡£ÔÙϸÖ·־ÍÊǰÑÐÂÉú´ú·ÖΪ£ºEden¿Õ¼ä¡¢FromSurvivor¿Õ¼ä¡¢To Survivor¿Õ¼ä¡£JVM¾ßÌåµÄÀ¬»ø»ØÊÕ»úÖÆ×ܽáÇë²é¿´ÎÒµÄÁíÍâһƪJVM¡ª¡ªÄÚ´æ¹ÜÀíºÍÀ¬»ø»ØÊÕ¡£
£¨4£©¸ù¾ÝJavaÐéÄâ»ú¹æ·¶µÄ¹æ¶¨£¬Java¶Ñ¿ÉÒÔ´¦ÓÚÎïÀíÉϲ»Á¬ÐøµÄÄÚ´æ¿Õ¼äÖУ¬Ö»ÒªÂß¼ÉÏÊÇÁ¬ÐøµÄ¼´¿É¡£
Èç¹ûÔÚ¶ÑÖÐûÓÐÄÚ´æÍê³ÉʵÀý·ÖÅ䣬²¢ÇÒ¶ÑÒ²ÎÞ·¨ÔÙÀ©Õ¹Ê±£¬½«»áÅ׳öOutOfMemoryErrorÒì³£¡£
5. ¶ÑºÍÕ»µÄÇø±ð
ÕâÊÇÒ»¸ö·Ç³£³£¼ûµÄÃæÊÔÌ⣬Ö÷Òª´ÓÒÔϼ¸¸ö·½ÃæÀ´»Ø´ð¡£
£¨1£©¸÷˾ÆäÖ°
×îÖ÷ÒªµÄÇø±ð¾ÍÊÇÕ»ÄÚ´æÓÃÀ´´æ´¢¾Ö²¿±äÁ¿ºÍ·½·¨µ÷ÓÃÐÅÏ¢¡£
¶ø¶ÑÄÚ´æÓÃÀ´´æ´¢JavaÖеĶÔÏó¡£ÎÞÂÛÊdzÉÔ±±äÁ¿¡¢¾Ö²¿±äÁ¿»¹ÊÇÀà±äÁ¿£¬ËüÃÇÖ¸ÏòµÄ¶ÔÏó¶¼´æ´¢ÔÚ¶ÑÄÚ´æÖС£
£¨2£©¿Õ¼ä´óС
Õ»µÄÄÚ´æÒªÔ¶Ô¶Ð¡ÓÚ¶ÑÄڴ棬Èç¹ûÄãʹÓõݹéµÄ»°£¬ÄÇôÄãµÄÕ»ºÜ¿ì¾Í»á³äÂú²¢²úÉúStackOverFlowError¡£
¹ØÓÚÈçºÎÉèÖöÑÕ»ÄÚ´æµÄ´óС£¬¿ÉÒԲ鿴JVM¡ª¡ªÄÚ´æ¹ÜÀíºÍÀ¬»ø»ØÊÕÖеÄÏà¹Ø½éÉÜ¡£
£¨3£©¶ÀÓл¹Êǹ²Ïí
Õ»ÄÚ´æ¹éÊôÓÚÏ̵߳Ä˽ÓÐÄڴ棬ÿ¸öÏ̶߳¼»áÓÐÒ»¸öÕ»Äڴ棬Æä´æ´¢µÄ±äÁ¿Ö»ÄÜÔÚÆäËùÊôÏß³ÌÖпɼû¡£
¶ø¶ÑÄÚ´æÖеĶÔÏó¶ÔËùÓÐÏ߳̿ɼû£¬¿ÉÒÔ±»ËùÓÐÏ̷߳ÃÎÊ¡£
£¨4£©Òì³£´íÎó
Èç¹ûÏß³ÌÇëÇóµÄÕ»Éî¶È´óÓÚÐéÄâ»úËùÔÊÐíµÄÉî¶È£¬½«Å׳öStackOverflowErrorÒì³£¡£
Èç¹ûJVMÕ»¿ÉÒÔ¶¯Ì¬À©Õ¹£¨´ó²¿·ÖJVMÊÇ¿ÉÒԵģ©£¬µ±À©Õ¹Ê±ÎÞ·¨ÉêÇëµ½×ã¹»ÄÚ´æÔòÅ׳öOutOfMemoryErrorÒì³£¡£
¶ø¶ÑÄÚ´æÃ»ÓпÉÓÃµÄ¿Õ¼ä´æ´¢Éú³ÉµÄ¶ÔÏó£¬JVM»áÅ׳öjava.lang.OutOfMemoryError¡£
|