±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ
cnblogs£¬ÎÄÖÐÖ÷Òª½²½âÁËJVMµÄ¸ÅÄ¹ÜÀí¼°Ö®¼äµÄ¹ØÏµ£¬ÃèÊöÁËÖ´ÐеĹý³ÌºÍÉúÃüÖÜÆÚ£¬Í¼Ê¾ÁËÌåϵ½á¹¹£¬Ïêϸ½â˵ÁËÔËÐÐÊÂÊý¾ÝÇøµÈ¡£ |
|
1. ʲôÊÇJVM£¿
JVMÊÇJava Virtual Machine£¨JavaÐéÄâ»ú£©µÄËõд£¬JVMÊÇÒ»ÖÖÓÃÓÚ¼ÆËãÉ豸µÄ¹æ·¶£¬ËüÊÇÒ»¸öÐé¹¹³öÀ´µÄ¼ÆËã»ú£¬ÊÇͨ¹ýÔÚʵ¼ÊµÄ¼ÆËã»úÉÏ·ÂտģÄâ¸÷ÖÖ¼ÆËã»ú¹¦ÄÜÀ´ÊµÏֵġ£JavaÐéÄâ»ú°üÀ¨Ò»Ì××Ö½ÚÂëÖ¸Á¡¢Ò»×é¼Ä´æÆ÷¡¢Ò»¸öÕ»¡¢Ò»¸öÀ¬»ø»ØÊնѺÍÒ»¸ö´æ´¢·½·¨Óò¡£
JVMÆÁ±ÎÁËÓë¾ßÌå²Ù×÷ϵͳƽ̨Ïà¹ØµÄÐÅÏ¢£¬Ê¹Java³ÌÐòÖ»ÐèÉú³ÉÔÚJavaÐéÄâ»úÉÏÔËÐеÄÄ¿±ê´úÂ루×Ö½ÚÂ룩,¾Í¿ÉÒÔÔÚ¶àÖÖÆ½Ì¨Éϲ»¼ÓÐ޸ĵØÔËÐС£JVMÔÚÖ´ÐÐ×Ö½ÚÂëʱ£¬Êµ¼ÊÉÏ×îÖÕ»¹ÊǰÑ×Ö½ÚÂë½âÊͳɾßÌåÆ½Ì¨ÉϵĻúÆ÷Ö¸ÁîÖ´ÐС£
JavaÓïÑÔµÄÒ»¸ö·Ç³£ÖØÒªµÄÌØµã¾ÍÊÇÓëÆ½Ì¨µÄÎÞ¹ØÐÔ¡£¶øÊ¹ÓÃJavaÐéÄâ»úÊÇʵÏÖÕâÒ»ÌØµãµÄ¹Ø¼ü¡£Ò»°ãµÄ¸ß¼¶ÓïÑÔÈç¹ûÒªÔÚ²»Í¬µÄƽ̨ÉÏÔËÐУ¬ÖÁÉÙÐèÒª±àÒë³É²»Í¬µÄÄ¿±ê´úÂë¡£¶øÒýÈëJavaÓïÑÔÐéÄâ»úºó£¬JavaÓïÑÔÔÚ²»Í¬Æ½Ì¨ÉÏÔËÐÐʱ²»ÐèÒªÖØÐ±àÒë¡£JavaÓïÑÔʹÓÃJavaÐéÄâ»úÆÁ±ÎÁËÓë¾ßÌåÆ½Ì¨Ïà¹ØµÄÐÅÏ¢£¬Ê¹µÃJavaÓïÑÔ±àÒë³ÌÐòÖ»ÐèÉú³ÉÔÚJavaÐéÄâ»úÉÏÔËÐеÄÄ¿±ê´úÂ루×Ö½ÚÂ룩£¬¾Í¿ÉÒÔÔÚ¶àÖÖÆ½Ì¨Éϲ»¼ÓÐ޸ĵØÔËÐС£JavaÐéÄâ»úÔÚÖ´ÐÐ×Ö½ÚÂëʱ£¬°Ñ×Ö½ÚÂë½âÊͳɾßÌåÆ½Ì¨ÉϵĻúÆ÷Ö¸ÁîÖ´ÐС£Õâ¾ÍÊÇJavaµÄÄܹ»¡°Ò»´Î±àÒ룬µ½´¦ÔËÐС±µÄÔÒò¡£
2. JRE/JDK/JVMÊÇʲô¹ØÏµ£¿
JRE(JavaRuntimeEnvironment£¬JavaÔËÐл·¾³)£¬Ò²¾ÍÊÇJavaƽ̨¡£ËùÓеÄJava
³ÌÐò¶¼ÒªÔÚJREϲÅÄÜÔËÐС£ÆÕͨÓû§Ö»ÐèÒªÔËÐÐÒÑ¿ª·¢ºÃµÄjava³ÌÐò£¬°²×°JRE¼´¿É¡£
JDK(Java Development Kit)ÊdzÌÐò¿ª·¢ÕßÓÃÀ´À´±àÒë¡¢µ÷ÊÔjava³ÌÐòÓõĿª·¢¹¤¾ß°ü¡£JDKµÄ¹¤¾ßÒ²ÊÇJava³ÌÐò£¬Ò²ÐèÒªJRE²ÅÄÜÔËÐС£ÎªÁ˱£³ÖJDKµÄ¶ÀÁ¢ÐÔºÍÍêÕûÐÔ£¬ÔÚJDKµÄ°²×°¹ý³ÌÖУ¬JREÒ²ÊÇ
°²×°µÄÒ»²¿·Ö¡£ËùÒÔ£¬ÔÚJDKµÄ°²×°Ä¿Â¼ÏÂÓÐÒ»¸öÃûΪjreµÄĿ¼£¬ÓÃÓÚ´æ·ÅJREÎļþ¡£
JVM(JavaVirtualMachine£¬JavaÐéÄâ»ú)ÊÇJREµÄÒ»²¿·Ö¡£ËüÊÇÒ»¸öÐé¹¹³öÀ´µÄ¼ÆËã»ú£¬ÊÇͨ¹ýÔÚʵ¼ÊµÄ¼ÆËã»úÉÏ·ÂտģÄâ¸÷ÖÖ¼ÆËã»ú¹¦ÄÜÀ´ÊµÏֵġ£JVMÓÐ×Ô¼ºÍêÉÆµÄÓ²¼þ¼Ü¹¹£¬Èç´¦ÀíÆ÷¡¢¶ÑÕ»¡¢¼Ä´æÆ÷µÈ£¬»¹¾ßÓÐÏàÓ¦µÄÖ¸Áîϵͳ¡£JavaÓïÑÔ×îÖØÒªµÄÌØµã¾ÍÊÇ¿çÆ½Ì¨ÔËÐС£Ê¹ÓÃJVM¾ÍÊÇΪÁËÖ§³ÖÓë²Ù×÷ϵͳÎ޹أ¬ÊµÏÖ¿çÆ½Ì¨¡£
3. JVMÔÀí
JVMÊÇjavaµÄºËÐĺͻù´¡£¬ÔÚjava±àÒëÆ÷ºÍosƽ̨֮¼äµÄÐéÄâ´¦ÀíÆ÷¡£ËüÊÇÒ»ÖÖÀûÓÃÈí¼þ·½·¨ÊµÏֵijéÏóµÄ¼ÆËã»ú»ùÓÚϲãµÄ²Ù×÷ϵͳºÍÓ²¼þƽ̨£¬¿ÉÒÔÔÚÉÏÃæÖ´ÐÐjavaµÄ×Ö½ÚÂë³ÌÐò¡£

java±àÒëÆ÷Ö»ÒªÃæÏòJVM£¬Éú³ÉJVMÄÜÀí½âµÄ´úÂë»ò×Ö½ÚÂëÎļþ¡£JavaÔ´Îļþ¾±àÒë³É×Ö½ÚÂë³ÌÐò£¬Í¨¹ýJVM½«Ã¿Ò»ÌõÖ¸Áî·Òë³É²»Í¬Æ½Ì¨»úÆ÷Â룬ͨ¹ýÌØ¶¨Æ½Ì¨ÔËÐС£
4. JVMÖ´ÐгÌÐòµÄ¹ý³Ì
1) ¼ÓÔØ.classÎļþ 2) ¹ÜÀí²¢·ÖÅäÄÚ´æ 3) Ö´ÐÐÀ¬»øÊÕ¼¯
JRE£¨javaÔËÐÐʱ»·¾³£©ÓÉJVM¹¹ÔìµÄjava³ÌÐòµÄÔËÐл·£¬Ò²ÊÇJava³ÌÐòÔËÐеĻ·¾³£¬µ«ÊÇËûͬʱһ¸ö²Ù×÷ϵͳµÄÒ»¸öÓ¦ÓóÌÐòÒ»¸ö½ø³Ì£¬Òò´ËËûÒ²ÓÐËû×Ô¼ºµÄÔËÐеÄÉúÃüÖÜÆÚ£¬Ò²ÓÐ×Ô¼ºµÄ´úÂëºÍÊý¾Ý¿Õ¼ä¡£JVMÔÚÕû¸öjdkÖд¦ÓÚ×îµ×²ã£¬¸ºÔðÓÚ²Ù×÷ϵͳµÄ½»»¥£¬ÓÃÀ´ÆÁ±Î²Ù×÷ϵͳ»·¾³£¬Ìṩһ¸öÍêÕûµÄJavaÔËÐл·¾³£¬Òò´ËÒ²¾ÍÐéÄâ¼ÆËã»ú¡£²Ù×÷ϵͳװÈëJVMÊÇͨ¹ýjdkÖÐJava.exeÀ´Íê³É£¬Í¨¹ýÏÂÃæ4²½À´Íê³ÉJVM»·¾³£º1)
´´½¨JVM×°ÔØ»·¾³ºÍÅäÖà 2) ×°ÔØJVM.dll 3) ³õʼ»¯JVM.dll²¢¹Ò½çµ½JNIENV(JNIµ÷ÓýӿÚ)ʵÀý4)
µ÷ÓÃJNIEnvʵÀý×°ÔØ²¢´¦ÀíclassÀà¡£
5. JVMµÄÉúÃüÖÜÆÚ
1) JVMʵÀý¶ÔÓ¦ÁËÒ»¸ö¶ÀÁ¢ÔËÐеÄjava³ÌÐòËüÊǽø³Ì¼¶±ð
a) Æô¶¯¡£Æô¶¯Ò»¸öJava³ÌÐòʱ£¬Ò»¸öJVMʵÀý¾Í²úÉúÁË£¬ÈκÎÒ»¸öÓµÓÐpublic static
void
main(String[] args)º¯ÊýµÄclass¶¼¿ÉÒÔ×÷ΪJVMʵÀýÔËÐÐµÄÆðµã
b) ÔËÐС£main()×÷Ϊ¸Ã³ÌÐò³õʼÏß³ÌµÄÆðµã£¬ÈÎºÎÆäËûÏ߳̾ùÓɸÃÏß³ÌÆô¶¯¡£JVMÄÚ²¿ÓÐÁ½ÖÖỊ̈߳ºÊØ»¤Ï̺߳ͷÇÊØ»¤Ị̈߳¬main()ÊôÓÚ·ÇÊØ»¤Ị̈߳¬ÊØ»¤Ïß³Ìͨ³£ÓÉJVM×Ô¼ºÊ¹Óã¬java³ÌÐòÒ²¿ÉÒÔ±íÃ÷×Ô¼º´´½¨µÄÏß³ÌÊÇÊØ»¤Ïß³Ì
c) ÏûÍö¡£µ±³ÌÐòÖеÄËùÓзÇÊØ»¤Ï̶߳¼ÖÕֹʱ£¬JVM²ÅÍ˳ö£»Èô°²È«¹ÜÀíÆ÷ÔÊÐí£¬³ÌÐòÒ²¿ÉÒÔʹÓÃRuntimeÀà»òÕßSystem.exit()À´Í˳ö
2) JVMÖ´ÐÐÒýÇæÊµÀýÔò¶ÔÓ¦ÁËÊôÓÚÓû§ÔËÐгÌÐòµÄÏß³ÌËüÊÇÏ̼߳¶±ðµÄ
6. JVMµÄÌåϵ½á¹¹

Àà×°ÔØÆ÷£¨ClassLoader£©£¨ÓÃÀ´×°ÔØ.classÎļþ£©
Ö´ÐÐÒýÇæ£¨Ö´ÐÐ×Ö½ÚÂ룬»òÕßÖ´Ðб¾µØ·½·¨£©
ÔËÐÐʱÊý¾ÝÇø£¨·½·¨Çø¡¢¶Ñ¡¢javaÕ»¡¢PC¼Ä´æÆ÷¡¢±¾µØ·½·¨Õ»£©
7. JVMÔËÐÐʱÊý¾ÝÇø

µÚÒ»¿é£ºPC¼Ä´æÆ÷
PC¼Ä´æÆ÷ÊÇÓÃÓڴ洢ÿ¸öÏß³ÌÏÂÒ»²½½«Ö´ÐеÄJVMÖ¸ÁÈç¸Ã·½·¨ÎªnativeµÄ£¬ÔòPC¼Ä´æÆ÷Öв»´æ´¢ÈκÎÐÅÏ¢¡£
µÚ¶þ¿é£ºJVMÕ»
JVMÕ»ÊÇÏß³Ì˽Óеģ¬Ã¿¸öÏ̴߳´½¨µÄͬʱ¶¼»á´´½¨JVMÕ»£¬JVMÕ»Öдæ·ÅµÄΪµ±Ç°Ïß³ÌÖоֲ¿»ù±¾ÀàÐ͵ıäÁ¿£¨javaÖж¨ÒåµÄ°ËÖÖ»ù±¾ÀàÐÍ£ºboolean¡¢char¡¢byte¡¢short¡¢int¡¢long¡¢float¡¢double£©¡¢²¿·ÖµÄ·µ»Ø½á¹ûÒÔ¼°Stack
Frame£¬·Ç»ù±¾ÀàÐ͵ĶÔÏóÔÚJVMÕ»ÉϽö´æ·ÅÒ»¸öÖ¸Ïò¶ÑÉϵĵØÖ·¡£
µÚÈý¿é£º¶Ñ£¨Heap£©
ËüÊÇJVMÓÃÀ´´æ´¢¶ÔÏóʵÀýÒÔ¼°Êý×éÖµµÄÇøÓò£¬¿ÉÒÔÈÏΪJavaÖÐËùÓÐͨ¹ýnew´´½¨µÄ¶ÔÏóµÄÄÚ´æ¶¼ÔÚ´Ë·ÖÅ䣬HeapÖеĶÔÏóµÄÄÚ´æÐèÒªµÈ´ýGC½øÐлØÊÕ¡£

£¨1£© ¶ÑÊÇJVMÖÐËùÓÐÏ̹߳²ÏíµÄ£¬Òò´ËÔÚÆäÉϽøÐжÔÏóÄÚ´æµÄ·ÖÅä¾ùÐèÒª½øÐмÓËø£¬ÕâÒ²µ¼ÖÂÁËnew¶ÔÏóµÄ¿ªÏúÊDZȽϴóµÄ
£¨2£© Sun Hotspot JVMΪÁËÌáÉý¶ÔÏóÄÚ´æ·ÖÅäµÄЧÂÊ£¬¶ÔÓÚËù´´½¨µÄÏ̶߳¼»á·ÖÅäÒ»¿é¶ÀÁ¢µÄ¿Õ¼äTLAB£¨Thread
Local Allocation Buffer£©£¬Æä´óСÓÉJVM¸ù¾ÝÔËÐеÄÇé¿ö¼ÆËã¶øµÃ£¬ÔÚTLABÉÏ·ÖÅä¶ÔÏóʱ²»ÐèÒª¼ÓËø£¬Òò´ËJVMÔÚ¸øÏ̵߳ĶÔÏó·ÖÅäÄÚ´æÊ±»á¾¡Á¿µÄÔÚTLABÉÏ·ÖÅ䣬ÔÚÕâÖÖÇé¿öÏÂJVMÖзÖÅä¶ÔÏóÄÚ´æµÄÐÔÄܺÍC»ù±¾ÊÇÒ»Ñù¸ßЧµÄ£¬µ«Èç¹û¶ÔÏó¹ý´óµÄ»°ÔòÈÔÈ»ÊÇÖ±½ÓʹÓöѿռä·ÖÅä
£¨3£© TLAB½ö×÷ÓÃÓÚÐÂÉú´úµÄEden Space£¬Òò´ËÔÚ±àдJava³ÌÐòʱ£¬Í¨³£¶à¸öСµÄ¶ÔÏó±È´óµÄ¶ÔÏó·ÖÅäÆðÀ´¸ü¼Ó¸ßЧ¡£
£¨4£© ËùÓÐд´½¨µÄObject ¶¼½«»á´æ´¢ÔÚÐÂÉú´úYong GenerationÖС£Èç¹ûYoung
GenerationµÄÊý¾ÝÔÚÒ»´Î»ò¶à´ÎGCºó´æ»îÏÂÀ´£¬ÄÇô½«±»×ªÒƵ½OldGeneration¡£ÐµÄObject×ÜÊÇ´´½¨ÔÚEden
Space¡£
µÚËĿ飺·½·¨ÇøÓò£¨Method Area£©
£¨1£©ÔÚSun JDKÖÐÕâ¿éÇøÓò¶ÔÓ¦µÄΪPermanetGeneration£¬ÓÖ³ÆÎª³Ö¾Ã´ú¡£
£¨2£©·½·¨ÇøÓò´æ·ÅÁËËù¼ÓÔØµÄÀàµÄÐÅÏ¢£¨Ãû³Æ¡¢ÐÞÊηûµÈ£©¡¢ÀàÖеľ²Ì¬±äÁ¿¡¢ÀàÖж¨ÒåΪfinalÀàÐ͵ij£Á¿¡¢ÀàÖеÄFieldÐÅÏ¢¡¢ÀàÖеķ½·¨ÐÅÏ¢£¬µ±¿ª·¢ÈËÔ±ÔÚ³ÌÐòÖÐͨ¹ýClass¶ÔÏóÖеÄgetName¡¢isInterfaceµÈ·½·¨À´»ñÈ¡ÐÅϢʱ£¬ÕâЩÊý¾Ý¶¼À´Ô´ÓÚ·½·¨ÇøÓò£¬Í¬Ê±·½·¨ÇøÓòÒ²ÊÇÈ«¾Ö¹²ÏíµÄ£¬ÔÚÒ»¶¨µÄÌõ¼þÏÂËüÒ²»á±»GC£¬µ±·½·¨ÇøÓòÐèҪʹÓõÄÄڴ泬¹ýÆäÔÊÐíµÄ´óСʱ£¬»áÅ׳öOutOfMemoryµÄ´íÎóÐÅÏ¢¡£
µÚÎå¿é£ºÔËÐÐʱ³£Á¿³Ø£¨Runtime Constant Pool£©
´æ·ÅµÄΪÀàÖеĹ̶¨µÄ³£Á¿ÐÅÏ¢¡¢·½·¨ºÍFieldµÄÒýÓÃÐÅÏ¢µÈ£¬Æä¿Õ¼ä´Ó·½·¨ÇøÓòÖзÖÅä¡£
µÚÁù¿é£º±¾µØ·½·¨¶ÑÕ»£¨Native Method Stacks£©
JVM²ÉÓñ¾µØ·½·¨¶ÑÕ»À´Ö§³Önative·½·¨µÄÖ´ÐУ¬´ËÇøÓòÓÃÓڴ洢ÿ¸önative·½·¨µ÷ÓõÄ״̬¡£
8. JVMÀ¬»ø»ØÊÕ
GC (Garbage Collection)µÄ»ù±¾ÔÀí£º½«ÄÚ´æÖв»ÔÙ±»Ê¹ÓõĶÔÏó½øÐлØÊÕ£¬GCÖÐÓÃÓÚ»ØÊյķ½·¨³ÆÎªÊÕ¼¯Æ÷£¬ÓÉÓÚGCÐèÒªÏûºÄһЩ×ÊÔ´ºÍʱ¼ä£¬JavaÔÚ¶Ô¶ÔÏóµÄÉúÃüÖÜÆÚÌØÕ÷½øÐзÖÎöºó£¬°´ÕÕÐÂÉú´ú¡¢¾ÉÉú´úµÄ·½Ê½À´¶Ô¶ÔÏó½øÐÐÊÕ¼¯£¬ÒÔ¾¡¿ÉÄܵÄËõ¶ÌGC¶ÔÓ¦ÓÃÔì³ÉµÄÔÝÍ£
£¨1£©¶ÔÐÂÉú´úµÄ¶ÔÏóµÄÊÕ¼¯³ÆÎªminor GC£»
£¨2£©¶Ô¾ÉÉú´úµÄ¶ÔÏóµÄÊÕ¼¯³ÆÎªFull GC£»
£¨3£©³ÌÐòÖÐÖ÷¶¯µ÷ÓÃSystem.gc()Ç¿ÖÆÖ´ÐеÄGCΪFull GC¡£
²»Í¬µÄ¶ÔÏóÒýÓÃÀàÐÍ£¬ GC»á²ÉÓò»Í¬µÄ·½·¨½øÐлØÊÕ£¬JVM¶ÔÏóµÄÒýÓ÷ÖΪÁËËÄÖÖÀàÐÍ£º
£¨1£©Ç¿ÒýÓãºÄ¬ÈÏÇé¿öÏ£¬¶ÔÏó²ÉÓõľùΪǿÒýÓã¨Õâ¸ö¶ÔÏóµÄʵÀýûÓÐÆäËû¶ÔÏóÒýÓã¬GCʱ²Å»á±»»ØÊÕ£©
£¨2£©ÈíÒýÓãºÈíÒýÓÃÊÇJavaÖÐÌṩµÄÒ»ÖֱȽÏÊʺÏÓÚ»º´æ³¡¾°µÄÓ¦Óã¨Ö»ÓÐÔÚÄÚ´æ²»¹»ÓõÄÇé¿öϲŻᱻGC£©
£¨3£©ÈõÒýÓãºÔÚGCʱһ¶¨»á±»GC»ØÊÕ
£¨4£©ÐéÒýÓãºÓÉÓÚÐéÒýÓÃÖ»ÊÇÓÃÀ´µÃÖª¶ÔÏóÊÇ·ñ±»GC
|