Java³ÌÐò×î³õÊÇͨ¹ý½âÊÍÆ÷£¨Interpreter£©½øÐнâÊÍÖ´Ðе쬵±ÐéÄâ»ú·¢ÏÖij¸ö·½·¨»ò´úÂë¿éµÄÔËÐÐÌØ±ðƵ·±Ê±£¬¾Í»á°ÑÕâЩ´úÂëÈ϶¨Îª¡°Èȵã´úÂ롱£¬ÎªÁËÌá¸ßÈȵã´úÂëµÄÖ´ÐÐЧÂÊ£¬ÔÚÔËÐÐʱ£¬
ÐéÄâ»ú½«»á°ÑÕâЩ´úÂë±àÒë³ÉÓë±¾µØÆ½Ì¨Ïà¹ØµÄ»úÆ÷Â룬²¢½øÐи÷ÖÖ²ã´ÎµÄÓÅ»¯£¬Íê³ÉÕâ¸öÈÎÎñµÄ±àÒëÆ÷³ÆÎª¼´Ê±±àÒëÆ÷£¬¼´Ê±±àÒëÆ÷±àÒëÐÔÄܵĺûµ¡¢
´úÂëÓÅ»¯³Ì¶ÈµÄ¸ßµÍÈ´ÊǺâÁ¿Ò»¿îÉÌÓÃÐéÄâ»úÓÅÐãÓë·ñµÄ×î¹Ø¼üµÄÖ¸±êÖ®Ò»£¬±¾Æª²©¿Í£¬ÎÒÃǽ«Ñ§Ï°¼´Ê±±àÒëÆ÷µÄÔË×÷¹ý³Ì¡££¨±¾Æª²©¿ÍÌá¼°µÄ±àÒëÆ÷¡¢
¼´Ê±±àÒëÆ÷¶¼ÊÇÖ¸HotSpotÐéÄâ»úÄڵļ´Ê±±àÒëÆ÷£¬ÐéÄâ»úÒ²ÊÇÌØÖ¸HotSpot
ÐéÄâ»ú¡££©
HotSpotÐéÄâ»úÄڵļ´Ê±±àÒëÆ÷
½âÊÍÆ÷Óë±àÒëÆ÷
Ðí¶àÖ÷Á÷µÄÉÌÓÃÐéÄâ»ú£¬ÈçHotSpot¡¢ J9µÈ£¬¶¼Í¬Ê±°üº¬½âÊÍÆ÷Óë±àÒëÆ÷£¬½âÊÍÆ÷Óë±àÒëÆ÷Á½Õ߸÷ÓÐÓÅÊÆ£ºµ±³ÌÐòÐèҪѸËÙÆô¶¯ºÍÖ´ÐеÄʱºò£¬½âÊÍÆ÷¿ÉÒÔÊ×ÏÈ·¢»Ó×÷Óã¬Ê¡È¥±àÒëµÄʱ¼ä£¬Á¢¼´Ö´ÐС£ÔÚ³ÌÐòÔËÐкó£¬Ëæ×Åʱ¼äµÄÍÆÒÆ£¬±àÒëÆ÷Öð½¥·¢»Ó×÷Ó㬰ÑÔ½À´Ô½¶àµÄ´úÂë±àÒë³É±¾µØ´úÂëÖ®ºó£¬¿ÉÒÔ»ñÈ¡¸ü¸ßµÄÖ´ÐÐЧÂÊ¡£
µ±³ÌÐòÔËÐл·¾³ÖÐÄÚ´æ×ÊÔ´ÏÞÖÆ½Ï´ó£¨È粿·ÖǶÈëʽϵͳÖУ©£¬¿ÉÒÔʹÓýâÊÍÖ´ÐнÚÔ¼Äڴ棬·´Ö®¿ÉÒÔʹÓñàÒëÖ´ÐÐÀ´ÌáÉýЧÂÊ¡£
½âÊÍÆ÷»¹¿ÉÒÔ×÷Ϊ±àÒëÆ÷¼¤½øÓÅ»¯Ê±µÄÒ»¸ö¡°ÌÓÉúÃÅ¡±£¬ÈñàÒëÆ÷¸ù¾Ý¸ÅÂÊÑ¡ÔñһЩ´ó¶àÊýʱºò¶¼ÄÜÌáÉýÔËÐÐËٶȵÄÓÅ»¯ÊֶΣ¬µ±¼¤½øÓÅ»¯µÄ¼ÙÉè²»³ÉÁ¢£¬Èç¼ÓÔØÁËÐÂÀàºóÀàÐͼ̳нṹ³öÏֱ仯¡¢
³öÏÖ¡°º±¼ûÏÝÚ塱£¨Uncommon Trap£©Ê±¿ÉÒÔͨ¹ýÄæÓÅ»¯£¨Deoptimization£©Í˻ص½½âÊÍ״̬¼ÌÐøÖ´ÐУ¨²¿·ÖûÓнâÊÍÆ÷µÄÐéÄâ»úÖÐÒ²»á²ÉÓò»½øÐм¤½øÓÅ»¯µÄC1±àÒëÆ÷[2]µ£ÈΡ°ÌÓÉúÃÅ¡±µÄ
½ÇÉ«£©

HotSpotÐéÄâ»úÖÐÄÚÖÃÁËÁ½¸ö¼´Ê±±àÒëÆ÷£¬·Ö±ð³ÆÎªClient CompilerºÍServer
Compiler£¬»òÕß¼ò³ÆÎªC1±àÒëÆ÷ºÍC2±àÒëÆ÷£¨Ò²½ÐOpto±àÒëÆ÷£©¡£ ĿǰÖ÷Á÷µÄHotSpotÐéÄâ»ú£¨SunϵÁÐJDK
1.7¼°Ö®Ç°°æ±¾µÄÐéÄâ»ú£©ÖУ¬Ä¬ÈϲÉÓýâÊÍÆ÷ÓëÆäÖÐÒ»¸ö±àÒëÆ÷Ö±½ÓÅäºÏµÄ·½Ê½¹¤×÷£¬³ÌÐòʹÓÃÄĸö±àÒëÆ÷£¬È¡¾öÓÚÐéÄâ»úÔËÐеÄģʽ£¬HotSpotÐéÄâ»ú»á¸ù¾Ý×ÔÉí°æ±¾ÓëËÞÖ÷»úÆ÷µÄÓ²¼þÐÔÄÜ×Ô¶¯Ñ¡ÔñÔËÐÐģʽ£¬Óû§Ò²¿ÉÒÔʹÓá°-client¡±»ò¡°-server¡±²ÎÊýÈ¥Ç¿ÖÆÖ¸¶¨ÐéÄâ»úÔËÐÐÔÚClientģʽ»òServerģʽ¡£
ÎÞÂÛ²ÉÓõıàÒëÆ÷ÊÇClient Compiler»¹ÊÇServer Compiler£¬½âÊÍÆ÷Óë±àÒëÆ÷´îÅäʹÓõķ½Ê½ÔÚÐéÄâ»úÖгÆÎª¡°»ìºÏģʽ¡±£¨Mixed
Mode£©£¬Óû§¿ÉÒÔʹÓòÎÊý¡°-Xint¡±Ç¿ÖÆÐéÄâ»úÔËÐÐÓÚ¡°½âÊÍģʽ¡±£¨Interpreted Mode£©£¬Õâʱ±àÒëÆ÷ÍêÈ«²»½éÈ빤×÷£¬È«²¿´úÂ붼ʹÓýâÊÍ·½Ê½Ö´ÐС£
ÁíÍ⣬Ҳ¿ÉÒÔʹÓòÎÊý¡°-Xcomp¡±Ç¿ÖÆÐéÄâ»úÔËÐÐÓÚ¡°±àÒëģʽ¡±£¨Compiled Mode£©£¬Õâʱ½«ÓÅÏȲÉÓñàÒ뷽ʽִÐгÌÐò£¬µ«ÊǽâÊÍÆ÷ÈÔȻҪÔÚ±àÒëÎÞ·¨½øÐеÄÇé¿öϽéÈëÖ´Ðйý³Ì£¬¿ÉÒÔͨ¹ýÐéÄâ»úµÄ¡°-version¡±ÃüÁîµÄÊä³ö½á¹ûÏÔʾ³öÕâ3ÖÖģʽ
C£º\£¾java-version
java version"1.6.0_22"
Java£¨TM£©SE Runtime Environment £¨build 1.6.0_22-b04£©
Dynamic Code Evolution 64-Bit Server VM £¨build
0.2-b02-internal£¬ 19.0-b04-internal,mixed mode£©
C£º\£¾java-Xint-version
java version"1.6.0_22"
Java£¨TM£©SE Runtime Environment £¨build 1.6.0_22-b04£©
Dynamic Code Evolution 64-Bit Server VM£¨build
0.2-b02-internal£¬19.0-b04-internal,interpreted
mode£©
C£º\£¾java-Xcomp-version
java version"1.6.0_22"
Java£¨TM£©SE Runtime Environment£¨build 1.6.0_22-b04£©
Dynamic Code Evolution 64-Bit Server VM £¨build
0.2-b02-internal£¬19.0-b04-internal,compiled mode£© |
ÓÉÓÚ¼´Ê±±àÒëÆ÷±àÒë±¾µØ´úÂëÐèÒªÕ¼ÓóÌÐòÔËÐÐʱ¼ä£¬ÎªÁËÔÚ³ÌÐòÆô¶¯ÏìÓ¦ËÙ¶ÈÓëÔËÐÐЧÂÊÖ®¼ä´ïµ½×î¼Ñƽºâ£¬HotSpotÐéÄâ»ú»¹»áÖð½¥ÆôÓ÷ֲã±àÒ루Tiered
Compilation£©µÄ²ßÂÔ£¬ÔÚJDK 1.7µÄServerģʽÐéÄâ»úÖÐ×÷ΪĬÈϱàÒë²ßÂÔ±»¿ªÆô¡£
·Ö²ã±àÒë¸ù¾Ý±àÒëÆ÷±àÒë¡¢ ÓÅ»¯µÄ¹æÄ£ÓëºÄʱ£¬»®·Ö³ö²»Í¬µÄ±àÒë²ã´Î£¬ÆäÖаüÀ¨£º
µÚ0²ã£¬³ÌÐò½âÊÍÖ´ÐУ¬½âÊÍÆ÷²»¿ªÆôÐÔÄÜ¼à¿Ø¹¦ÄÜ£¨Profiling£©£¬¿É´¥·¢µÚ1²ã±àÒë¡£
µÚ1²ã£¬Ò²³ÆÎªC1±àÒ룬½«×Ö½ÚÂë±àÒëΪ±¾µØ´úÂ룬½øÐмòµ¥¡¢ ¿É¿¿µÄÓÅ»¯£¬ÈçÓбØÒª½«¼ÓÈëÐÔÄÜ¼à¿ØµÄÂß¼¡£
µÚ2²ã£¨»ò2²ãÒÔÉÏ£©£¬Ò²³ÆÎªC2±àÒ룬ҲÊǽ«×Ö½ÚÂë±àÒëΪ±¾µØ´úÂ룬µ«ÊÇ»áÆôÓÃһЩ±àÒëºÄʱ½Ï³¤µÄÓÅ»¯£¬ÉõÖÁ»á¸ù¾ÝÐÔÄÜ¼à¿ØÐÅÏ¢½øÐÐһЩ²»¿É¿¿µÄ¼¤½øÓÅ»¯¡£
ʵʩ·Ö²ã±àÒëºó£¬Client CompilerºÍServer Compiler½«»áͬʱ¹¤×÷£¬Ðí¶à´úÂë¶¼¿ÉÄܻᱻ¶à´Î±àÒ룬ÓÃClient
Compiler»ñÈ¡¸ü¸ßµÄ±àÒëËÙ¶È£¬ÓÃServer CompilerÀ´»ñÈ¡¸üºÃµÄ±àÒëÖÊÁ¿£¬ÔÚ½âÊÍÖ´ÐеÄʱºòÒ²ÎÞÐëÔٳе£ÊÕ¼¯ÐÔÄÜ¼à¿ØÐÅÏ¢µÄÈÎÎñ¡£
±àÒë¶ÔÏóÓë´¥·¢Ìõ¼þ
ÔÚÔËÐйý³ÌÖлᱻ¼´Ê±±àÒëÆ÷±àÒëµÄ¡°Èȵã´úÂ롱ÓÐÁ½Àà
1.±»¶à´Îµ÷Óõķ½·¨
2.±»¶à´ÎÖ´ÐеÄÑ»·Ìå
ǰÕߺܺÃÀí½â£¬Ò»¸ö·½·¨±»µ÷ÓõöàÁË£¬·½·¨ÌåÄÚ´úÂëÖ´ÐеĴÎÊý×ÔÈ»¾Í¶à£¬Ëü³ÉΪ¡°Èȵã´úÂ롱ÊÇÀíËùµ±È»µÄ¡£
¶øºóÕßÔòÊÇΪÁ˽â¾öÒ»¸ö·½·¨Ö»±»µ÷ÓùýÒ»´Î»òÉÙÁ¿µÄ¼¸´Î£¬µ«ÊÇ·½·¨ÌåÄÚ²¿´æÔÚÑ»·´ÎÊý½Ï¶àµÄÑ»·ÌåµÄÎÊÌ⣬ÕâÑùÑ»·ÌåµÄ´úÂëÒ²±»Öظ´Ö´Ðжà´Î£¬Òò´ËÕâЩ´úÂëÒ²Ó¦¸ÃÈÏΪÊÇ¡°Èȵã´úÂ롱¡£
¶ÔÓÚµÚÒ»ÖÖÇé¿ö£¬ÓÉÓÚÊÇÓÉ·½·¨µ÷Óô¥·¢µÄ±àÒ룬Òò´Ë±àÒëÆ÷ÀíËùµ±È»µØ»áÒÔÕû¸ö·½·¨×÷Ϊ±àÒë¶ÔÏó£¬ÕâÖÖ±àÒëÒ²ÊÇÐéÄâ»úÖбê×¼µÄJIT±àÒ뷽ʽ¡£
¶ø¶ÔÓÚºóÒ»ÖÖÇé¿ö£¬¾¡¹Ü±àÒ붯×÷ÊÇÓÉÑ»·ÌåËù´¥·¢µÄ£¬µ«±àÒëÆ÷ÒÀÈ»»áÒÔÕû¸ö·½·¨£¨¶ø²»Êǵ¥¶ÀµÄÑ»·Ì壩×÷Ϊ±àÒë¶ÔÏó¡£
ÕâÖÖ±àÒ뷽ʽÒòΪ±àÒë·¢ÉúÔÚ·½·¨Ö´Ðйý³ÌÖ®ÖУ¬Òò´ËÐÎÏ󵨳ÆÖ®ÎªÕ»ÉÏÌæ»»£¨OnStack Replacement£¬¼ò³ÆÎªOSR±àÒ룬¼´·½·¨Õ»Ö¡»¹ÔÚÕ»ÉÏ£¬·½·¨¾Í±»Ìæ»»ÁË£©¡£
ÅжÏÒ»¶Î´úÂëÊDz»ÊÇÈȵã´úÂ룬ĿǰÖ÷ÒªµÄÈȵã̽²âÅж¨·½Ê½ÓÐÁ½ÖÖ
»ùÓÚ²ÉÑùµÄÈȵã̽²â£¨Sample Based Hot Spot Detection£©£º²ÉÓÃÕâÖÖ·½·¨µÄÐéÄâ»ú»áÖÜÆÚÐԵؼì²é¸÷¸öÏ̵߳ÄÕ»¶¥£¬Èç¹û·¢ÏÖij¸ö£¨»òijЩ£©·½·¨¾³£³öÏÖÔÚÕ»¶¥£¬ÄÇÕâ¸ö·½·¨¾ÍÊÇ¡°Èȵ㷽·¨¡±¡£
»ùÓÚ²ÉÑùµÄÈȵã̽²âµÄºÃ´¦ÊÇʵÏÖ¼òµ¥¡¢ ¸ßЧ£¬»¹¿ÉÒÔºÜÈÝÒ׵ػñÈ¡·½·¨µ÷ÓùØÏµ£¨½«µ÷ÓöÑÕ»Õ¹¿ª¼´¿É£©£¬È±µãÊǺÜÄѾ«È·µØÈ·ÈÏÒ»¸ö·½·¨µÄÈȶȣ¬ÈÝÒ×ÒòΪÊܵ½Ïß³Ì×èÈû»ò±ðµÄÍâ½çÒòËØµÄÓ°Ïì¶øÈÅÂÒÈȵã̽²â¡£
»ùÓÚ¼ÆÊýÆ÷µÄÈȵã̽²â£¨Counter Based Hot Spot Detection£©£º²ÉÓÃÕâÖÖ·½·¨µÄÐéÄâ»ú»áΪÿ¸ö·½·¨£¨ÉõÖÁÊÇ´úÂë¿é£©½¨Á¢¼ÆÊýÆ÷£¬Í³¼Æ·½·¨µÄÖ´ÐдÎÊý£¬Èç¹ûÖ´ÐдÎÊý³¬¹ýÒ»¶¨µÄãÐÖµ¾ÍÈÏΪËüÊÇ¡°Èȵ㷽·¨¡±¡£
ÕâÖÖͳ¼Æ·½·¨ÊµÏÖÆðÀ´Â鷳һЩ£¬ÐèҪΪÿ¸ö·½·¨½¨Á¢²¢Î¬»¤¼ÆÊýÆ÷£¬¶øÇÒ²»ÄÜÖ±½Ó»ñÈ¡µ½·½·¨µÄµ÷ÓùØÏµ£¬µ«ÊÇËüµÄͳ¼Æ½á¹ûÏà¶ÔÀ´Ëµ¸ü¼Ó¾«È·ºÍÑϽ÷¡£
ÔÚHotSpotÐéÄâ»úÖÐʹÓõÄÊǵڶþÖÖ¡ª¡ª»ùÓÚ¼ÆÊýÆ÷µÄÈȵã̽²â·½·¨£¬Òò´ËËüΪÿ¸ö·½·¨×¼±¸ÁËÁ½Àà¼ÆÊýÆ÷£º·½·¨µ÷ÓüÆÊýÆ÷£¨Invocation
Counter£©ºÍ»Ø±ß¼ÆÊýÆ÷£¨Back Edge
Counter£©¡£
ÔÚÈ·¶¨ÐéÄâ»úÔËÐвÎÊýµÄǰÌáÏ£¬ÕâÁ½¸ö¼ÆÊýÆ÷¶¼ÓÐÒ»¸öÈ·¶¨µÄãÐÖµ£¬µ±¼ÆÊýÆ÷³¬¹ýãÐÖµÒç³öÁË£¬¾Í»á´¥·¢JIT±àÒë¡£
ÎÒÃÇÊ×ÏÈÀ´¿´¿´·½·¨µ÷ÓüÆÊýÆ÷¡£ Õâ¸ö¼ÆÊýÆ÷¾ÍÓÃÓÚͳ¼Æ·½·¨±»µ÷ÓõĴÎÊý£¬ËüµÄĬÈÏãÐÖµÔÚClientģʽÏÂÊÇ1500´Î£¬ÔÚServerģʽÏÂÊÇ10
000´Î£¬Õâ¸öãÐÖµ¿ÉÒÔͨ¹ýÐéÄâ»ú²ÎÊý-XX£ºCompileThresholdÀ´ÈËΪÉ趨¡£ µ±Ò»¸ö·½·¨±»µ÷ÓÃʱ£¬»áÏȼì²é¸Ã·½·¨ÊÇ·ñ´æÔÚ±»JIT±àÒë¹ýµÄ°æ±¾£¬Èç¹û´æÔÚ£¬ÔòÓÅÏÈʹÓñàÒëºóµÄ±¾µØ´úÂëÀ´Ö´ÐС£
Èç¹û²»´æÔÚÒѱ»±àÒë¹ýµÄ°æ±¾£¬Ôò½«´Ë·½·¨µÄµ÷ÓüÆÊýÆ÷Öµ¼Ó1£¬È»ºóÅжϷ½·¨µ÷ÓüÆÊýÆ÷Óë»Ø±ß¼ÆÊýÆ÷ÖµÖ®ºÍÊÇ·ñ³¬¹ý·½·¨µ÷ÓüÆÊýÆ÷µÄãÐÖµ¡£
Èç¹ûÒѳ¬¹ýãÐÖµ£¬ÄÇô½«»áÏò¼´Ê±±àÒëÆ÷Ìá½»Ò»¸ö¸Ã·½·¨µÄ´úÂë±àÒëÇëÇó¡£
Èç¹û²»×öÈκÎÉèÖã¬Ö´ÐÐÒýÇæ²¢²»»áͬ²½µÈ´ý±àÒëÇëÇóÍê³É£¬¶øÊǼÌÐø½øÈë½âÊÍÆ÷°´ÕÕ½âÊÍ·½Ê½Ö´ÐÐ×Ö½ÚÂ룬ֱµ½Ìá½»µÄÇëÇó±»±àÒëÆ÷±àÒëÍê³É¡£
µ±±àÒ빤×÷Íê³ÉÖ®ºó£¬Õâ¸ö·½·¨µÄµ÷ÓÃÈë¿ÚµØÖ·¾Í»á±»ÏµÍ³×Ô¶¯¸Äд³Éеģ¬ÏÂÒ»´Îµ÷Óø÷½·¨Ê±¾Í»áʹÓÃÒѱàÒëµÄ°æ±¾¡£

Èç¹û²»×öÈκÎÉèÖ㬷½·¨µ÷ÓüÆÊýÆ÷ͳ¼ÆµÄ²¢²»ÊÇ·½·¨±»µ÷Óõľø¶Ô´ÎÊý£¬¶øÊÇÒ»¸öÏà¶ÔµÄÖ´ÐÐÆµÂÊ£¬¼´Ò»¶Îʱ¼äÖ®ÄÚ·½·¨±»µ÷ÓõĴÎÊý¡£
µ±³¬¹ýÒ»¶¨µÄʱ¼äÏÞ¶È£¬Èç¹û·½·¨µÄµ÷ÓôÎÊýÈÔÈ»²»×ãÒÔÈÃËüÌá½»¸ø¼´Ê±±àÒëÆ÷±àÒ룬ÄÇÕâ¸ö·½·¨µÄµ÷ÓüÆÊýÆ÷¾Í»á±»¼õÉÙÒ»°ë£¬Õâ¸ö¹ý³Ì³ÆÎª·½·¨µ÷ÓüÆÊýÆ÷ÈȶȵÄË¥¼õ£¨Counter
Decay£©£¬¶øÕâ¶Îʱ¼ä¾Í³ÆÎª´Ë·½·¨Í³¼ÆµÄ°ëË¥ÖÜÆÚ£¨Counter Half Life Time£©¡£
½øÐÐÈȶÈË¥¼õµÄ¶¯×÷ÊÇÔÚÐéÄâ»ú½øÐÐÀ¬»øÊÕ¼¯Ê±Ë³±ã½øÐеģ¬¿ÉÒÔʹÓÃÐéÄâ»ú²ÎÊý-XX£º-UseCounterDecayÀ´¹Ø±ÕÈȶÈË¥¼õ£¬È÷½·¨¼ÆÊýÆ÷ͳ¼Æ·½·¨µ÷Óõľø¶Ô´ÎÊý£¬ÕâÑù£¬Ö»ÒªÏµÍ³ÔËÐÐʱ¼ä×ã¹»³¤£¬¾ø´ó²¿·Ö·½·¨¶¼»á±»±àÒë³É±¾µØ´úÂë¡£
ÁíÍ⣬¿ÉÒÔʹÓÃ-XX£ºCounterHalfLifeTime²ÎÊýÉèÖðëË¥ÖÜÆÚµÄʱ¼ä£¬µ¥Î»ÊÇÃë¡£
»Ø±ß¼ÆÊýÆ÷£¬ËüµÄ×÷ÓÃÊÇͳ¼ÆÒ»¸ö·½·¨ÖÐÑ»·Ìå´úÂëÖ´ÐеĴÎÊý£¬ÔÚ×Ö½ÚÂëÖÐÓöµ½¿ØÖÆÁ÷ÏòºóÌø×ªµÄÖ¸Áî³ÆÎª¡°»Ø±ß¡±£¨Back
Edge£©¡£ ÏÔÈ»£¬½¨Á¢»Ø±ß¼ÆÊýÆ÷ͳ¼ÆµÄÄ¿µÄ¾ÍÊÇΪÁË´¥·¢OSR±àÒë¡£
¹ØÓڻر߼ÆÊýÆ÷µÄãÐÖµ£¬ËäÈ»HotSpotÐéÄâ»úÒ²ÌṩÁËÒ»¸öÀàËÆÓÚ·½·¨µ÷ÓüÆÊýÆ÷ãÐÖµ-XX£ºCompileThresholdµÄ²ÎÊý-XX£ºBackEdgeThreshold¹©Óû§ÉèÖ㬵«Êǵ±Ç°µÄÐéÄâ»úʵ¼Ê
Éϲ¢Î´Ê¹Óô˲ÎÊý£¬Òò´ËÎÒÃÇÐèÒªÉèÖÃÁíÍâÒ»¸ö²ÎÊý-XX£ºOnStackReplacePercentageÀ´¼ä½Óµ÷Õû»Ø±ß¼ÆÊýÆ÷µÄãÐÖµ£¬Æä¼ÆË㹫ʽÈçÏ¡£
·½·¨µ÷ÓüÆÊýÆ÷ãÐÖµ£¨CompileThreshold£©¡ÁOSR±ÈÂÊ£¨OnStackReplacePercentage£©/100
ÆäÖÐOnStackReplacePercentageĬÈÏֵΪ933£¬Èç¹û¶¼È¡Ä¬ÈÏÖµ£¬ÄÇClientģʽÐéÄâ»úµÄ»Ø±ß¼ÆÊýÆ÷µÄãÐֵΪ13995¡£
ÐéÄâ»úÔËÐÐÔÚServerģʽÏ£¬»Ø±ß¼ÆÊýÆ÷ãÐÖµµÄ¼ÆË㹫ʽΪ£º
·½·¨µ÷ÓüÆÊýÆ÷ãÐÖµ£¨CompileThreshold£©¡Á£¨OSR±ÈÂÊ£¨OnStackReplacePercentage£©-½âÊÍÆ÷¼à¿Ø±ÈÂÊ£¨InterpreterProfilePercentage£©/100
ÆäÖÐOnStackReplacePercentageĬÈÏֵΪ140£¬InterpreterProfilePercentageĬÈÏֵΪ33£¬Èç¹û¶¼È¡Ä¬ÈÏÖµ£¬ÄÇServerģʽÐéÄâ»ú»Ø±ß¼ÆÊýÆ÷µÄãÐֵΪ10700¡£
µ±½âÊÍÆ÷Óöµ½Ò»Ìõ»Ø±ßÖ¸Áîʱ£¬»áÏȲéÕÒ½«ÒªÖ´ÐеĴúÂëÆ¬¶ÎÊÇ·ñÓÐÒѾ±àÒëºÃµÄ°æ±¾£¬Èç¹ûÓУ¬Ëü½«»áÓÅÏÈÖ´ÐÐÒѱàÒëµÄ´úÂ룬·ñÔò¾Í°Ñ»Ø±ß¼ÆÊýÆ÷µÄÖµ¼Ó1£¬È»ºóÅжϷ½·¨µ÷ÓüÆÊýÆ÷Óë»Ø±ß¼ÆÊýÆ÷ÖµÖ®ºÍÊÇ·ñ³¬¹ý»Ø±ß¼ÆÊýÆ÷µÄãÐÖµ¡£
µ±³¬¹ýãÐÖµµÄʱºò£¬½«»áÌá½»
Ò»¸öOSR±àÒëÇëÇ󣬲¢ÇҰѻر߼ÆÊýÆ÷µÄÖµ½µµÍһЩ£¬ÒÔ±ã¼ÌÐøÔÚ½âÊÍÆ÷ÖÐÖ´ÐÐÑ»·£¬µÈ´ý±àÒëÆ÷Êä³ö±àÒë½á¹û

Óë·½·¨¼ÆÊýÆ÷²»Í¬£¬»Ø±ß¼ÆÊýÆ÷ûÓмÆÊýÈȶÈË¥¼õµÄ¹ý³Ì£¬Òò´ËÕâ¸ö¼ÆÊýÆ÷ͳ¼ÆµÄ¾ÍÊǸ÷½·¨Ñ»·Ö´Ðеľø¶Ô´ÎÊý¡£
µ±¼ÆÊýÆ÷Òç³öµÄʱºò£¬Ëü»¹»á°Ñ·½·¨¼ÆÊýÆ÷µÄÖµÒ²µ÷Õûµ½Òç³ö״̬£¬ÕâÑùÏ´ÎÔÙ½øÈë¸Ã·½·¨µÄʱºò¾Í»áÖ´Ðбê×¼±àÒë¹ý³Ì¡£
ÉÏÊöÁ½ÕÅͼ¶¼½ö½öÃèÊöÁËClient VMµÄ¼´Ê±±àÒ뷽ʽ£¬¶ÔÓÚServer VMÀ´Ëµ£¬Ö´ÐÐÇé¿ö»á±ÈÉÏÃæµÄÃèÊö¸ü¸´ÔÓһЩ¡£
×¢£º
1.³ýÕâÁ½ÖÖ·½Ê½Í⣬»¹ÓÐÆäËûÈȵã´úÂëµÄ̽²â·½Ê½£¬Èç»ùÓÚ¡°×Ù¼£¡±£¨Trace£©µÄÈȵã̽²âÔÚ×î½üÏ൱Á÷ÐУ¬ÏñFireFoxÖеÄTraceMonkeyºÍDalvikÖÐеÄJIT±àÒëÆ÷¶¼ÓÃÁËÕâÖÖÈȵã̽²â·½
ʽ¡£
2.»Ø±ßµÄ´ÎÊý²¢²»ÊÇÑ»·´ÎÊý£¬ÒòΪ²¢·ÇËùÓеÄÑ»·¶¼Êǻرߣ¬Èç¿ÕÑ»·Êµ¼ÊÉϾͿÉÒÔÊÓΪ×Ô¼ºÌø×ªµ½×Ô¼ºµÄ¹ý³Ì£¬Òò´Ë²¢²»Ëã×÷¿ØÖÆÁ÷ÏòºóÌø×ª£¬Ò²²»»á±»»Ø±ß¼ÆÊýÆ÷ͳ¼Æ¡£
±àÒë¹ý³Ì
ÔÚĬÈÏÉèÖÃÏ£¬ÎÞÂÛÊÇ·½·¨µ÷ÓòúÉúµÄ¼´Ê±±àÒëÇëÇ󣬻¹ÊÇOSR±àÒëÇëÇó£¬ÐéÄâ»úÔÚ´úÂë±àÒëÆ÷»¹Î´Íê³É֮ǰ£¬¶¼ÈÔÈ»½«°´ÕÕ½âÊÍ·½Ê½¼ÌÐøÖ´ÐУ¬¶ø±àÒ붯×÷ÔòÔÚºǫ́µÄ±àÒëÏß³ÌÖнøÐС£
Óû§¿ÉÒÔͨ¹ý²ÎÊý-XX£º-BackgroundCompilationÀ´½ûÖ¹ºǫ́±àÒ룬ÔÚ½ûÖ¹ºǫ́±àÒëºó£¬Ò»µ©´ïµ½JITµÄ±àÒëÌõ¼þ£¬Ö´ÐÐÏß³ÌÏòÐéÄâ»úÌá½»±àÒëÇëÇóºó½«»áÒ»Ö±µÈ´ý£¬Ö±µ½±àÒë¹ý³ÌÍê³ÉºóÔÙ¿ªÊ¼Ö´ÐбàÒëÆ÷Êä³öµÄ±¾µØ´úÂë¡£
ÄÇôÔÚºǫִ́ÐбàÒëµÄ¹ý³ÌÖУ¬±àÒëÆ÷×öÁËʲôÊÂÇéÄØ£¿Server CompilerºÍClient CompilerÁ½¸ö±àÒëÆ÷µÄ±àÒë¹ý³ÌÊDz»Ò»ÑùµÄ¡£
¶ÔÓÚClient CompilerÀ´Ëµ£¬ËüÊÇÒ»¸ö¼òµ¥¿ìËÙµÄÈý¶Îʽ±àÒëÆ÷£¬Ö÷ÒªµÄ¹Ø×¢µãÔÚÓÚ¾Ö²¿ÐÔµÄÓÅ»¯£¬¶ø·ÅÆúÁËÐí¶àºÄʱ½Ï³¤µÄÈ«¾ÖÓÅ»¯ÊֶΡ£
ÔÚµÚÒ»¸ö½×¶Î£¬Ò»¸öƽ̨¶ÀÁ¢µÄǰ¶Ë½«×Ö½ÚÂë¹¹Ôì³ÉÒ»Öָ߼¶Öмä´úÂë±íʾ£¨HighLevel Intermediate
Representaion,HIR£©¡£ HIRʹÓþ²Ì¬µ¥·ÖÅ䣨Static Single Assignment,SSA£©
µÄÐÎʽÀ´´ú±í´úÂëÖµ£¬Õâ¿ÉÒÔʹµÃһЩÔÚHIRµÄ¹¹Ôì¹ý³ÌÖ®ÖкÍÖ®ºó½øÐеÄÓÅ»¯¶¯×÷¸üÈÝÒ×ʵÏÖ¡£ ÔÚ´Ë֮ǰ±àÒëÆ÷»áÔÚ×Ö½ÚÂëÉÏÍê³ÉÒ»²¿·Ö»ù´¡ÓÅ»¯£¬Èç·½·¨ÄÚÁª¡¢
³£Á¿´«²¥µÈÓÅ»¯½«»áÔÚ×Ö½ÚÂë±»¹¹Ôì³ÉHIR֮ǰÍê³É¡£
ÔÚµÚ¶þ¸ö½×¶Î£¬Ò»¸öƽ̨Ïà¹ØµÄºó¶Ë´ÓHIRÖвúÉúµÍ¼¶Öмä´úÂë±íʾ£¨Low-Level Intermediate
Representation,LIR£©£¬¶øÔÚ´Ë֮ǰ»áÔÚHIRÉÏÍê³ÉÁíÍâһЩÓÅ»¯£¬Èç¿ÕÖµ¼ì²éÏû³ý¡¢ ·¶Î§¼ì²éÏû³ýµÈ£¬ÒÔ±ãÈÃHIR´ïµ½¸ü¸ßЧµÄ´úÂë±íʾÐÎʽ¡£
×îºó½×¶ÎÊÇÔÚÆ½Ì¨Ïà¹ØµÄºó¶ËʹÓÃÏßÐÔɨÃèËã·¨£¨Linear Scan Register Allocation£©ÔÚLIRÉÏ·ÖÅä¼Ä´æÆ÷£¬²¢ÔÚLIRÉÏ×ö¿ú¿×£¨Peephole£©ÓÅ»¯£¬È»ºó²úÉú»úÆ÷´úÂë¡£
Client CompilerµÄ
´óÖÂÖ´Ðйý³ÌÈçͼËùʾ¡£

¶øServer CompilerÔòÊÇרÃÅÃæÏò·þÎñ¶ËµÄµäÐÍÓ¦Óò¢Îª·þÎñ¶ËµÄÐÔÄÜÅäÖÃÌØ±ðµ÷Õû¹ýµÄ±àÒëÆ÷£¬Ò²ÊÇÒ»¸ö³ä·ÖÓÅ»¯¹ýµÄ¸ß¼¶±àÒëÆ÷£¬¼¸ºõÄÜ´ïµ½GNU
C++±àÒëÆ÷ʹÓÃ-O2²ÎÊýʱµÄÓÅ»¯Ç¿¶È£¬Ëü»áÖ´ÐÐËùÓоµäµÄÓÅ»¯¶¯×÷£¬ÈçÎÞÓôúÂëÏû³ýµÈ£¬ÁíÍ⣬»¹¿ÉÄܸù¾Ý½âÊÍÆ÷»òClient
CompilerÌṩµÄÐÔÄÜ¼à¿ØÐÅÏ¢£¬½øÐÐһЩ²»Îȶ¨µÄ¼¤½øÓÅ»¯£¬ÈçÊØ»¤ÄÚÁª£¨Guarded Inlining£©¡¢
·Ö֧ƵÂÊÔ¤²â£¨Branch Frequency Prediction£©µÈ¡£
ÒÔ¼´Ê±±àÒëµÄ±ê×¼À´¿´£¬Server CompilerÎÞÒÉÊDZȽϻºÂýµÄ£¬µ«ËüµÄ±àÒëËÙ¶ÈÒÀȻԶԶ³¬¹ý´«Í³µÄ¾²Ì¬ÓÅ»¯±àÒëÆ÷£¬¶øÇÒËüÏà¶ÔÓÚClient
Compiler±àÒëÊä³öµÄ´úÂëÖÊÁ¿ÓÐËùÌá¸ß£¬¿ÉÒÔ¼õÉÙ±¾µØ´úÂëµÄÖ´ÐÐʱ¼ä£¬´Ó¶øµÖÏûÁ˶îÍâµÄ±àÒëʱ¼ä¿ªÏú£¬ËùÒÔÒ²Óкܶà·Ç·þÎñ¶ËµÄÓ¦ÓÃÑ¡ÔñʹÓÃServerģʽµÄÐéÄâ»úÔËÐС£
²é¿´¼°·ÖÎö¼´Ê±±àÒë½á¹û
ÕâÀïµÄÔËÐвÎÊýÓÐÒ»²¿·ÖÐèÒªDebug»òFastDebug°æÐéÄâ»úµÄÖ§³Ö£¬Product°æµÄÐéÄâ»úÎÞ·¨Ê¹ÓÃÕⲿ·Ö²ÎÊý¡£
¿ÉÒÔÔÚOpenJDKÍø
Õ¾ÉÏÖ±½ÓÏÂÔØFastDebug°æµÄJDK£¨´ÓJDK 6u25Ö®ºóOracle¹ÙÍø¾Í²»ÔÙÌṩFastDebugµÄJDKÏÂÔØÁË£©¡£
²âÊÔ´úÂë
public static
final int NUM=15000£»
public static int doubleValue£¨int i£©{
//Õâ¸ö¿ÕÑ»·ÓÃÓÚºóÃæÑÝʾJIT´úÂëÓÅ»¯¹ý³Ì
for£¨int j=0£»j£¼100000£»j++£©£»
return i*2£»
}p
ublic static long calcSum£¨£©{
long sum=0£»
for£¨int i=1£»i£¼=100£»i++£©{
sum+=doubleValue£¨i£©£»
}r
eturn sum£»
}p
ublic static void main£¨String[]args£©{
for£¨int i=0£»i£¼NUM£»i++£©{
calcSum£¨£©£»
}} |
Ê×ÏÈÔËÐÐÕâ¶Î´úÂ룬²¢ÇÒÈ·ÈÏÕâ¶Î´úÂëÊÇ·ñ´¥·¢Á˼´Ê±±àÒ룬Ҫ֪µÀij¸ö·½·¨ÊÇ·ñ±»±àÒë¹ý£¬¿ÉÒÔʹÓòÎÊý-XX£º+PrintCompilationÒªÇóÐéÄâ»úÔÚ¼´Ê±±àÒëʱ½«±»±àÒë³É±¾µØ´úÂëµÄ·½·¨Ãû³Æ´òÓ¡³öÀ´£¬£¨ÆäÖдøÓС°%¡±µÄÊä³ö˵Ã÷ÊÇÓɻر߼ÆÊýÆ÷´¥·¢µÄOSR±àÒ룩¡£
VM option'+PrintCompilation'
310 1 java.lang.String£ºcharAt£¨33 bytes£©
329 2 org.fenixsoft.jit.Test£ºcalcSum£¨26 bytes£©
329 3 org.fenixsoft.jit.Test£ºdoubleValue£¨4 bytes£©
332 1%org.fenixsoft.jit.Test£ºmain@5£¨20 bytes£© |
´ÓÊä³öµÄÈ·ÈÏÐÅÏ¢ÖпÉÒÔÈ·ÈÏmain£¨£©¡¢ calcSum£¨£©ºÍdoubleValue£¨£©·½·¨ÒѾ±»±àÒ룬ÎÒÃÇ»¹¿ÉÒÔ¼ÓÉϲÎÊý-XX£º+PrintInliningÒªÇóÐéÄâ»úÊä³ö·½·¨ÄÚÁªÐÅÏ¢
ÄÚÁªÐÅÏ¢
VM option'+PrintCompilation'
VM option'+PrintInlining'
273 1 java.lang.String£ºcharAt£¨33 bytes£©
291 2 org.fenixsoft.jit.Test£ºcalcSum£¨26 bytes£©
@9 org.fenixsoft.jit.Test£ºdoubleValue inline£¨hot£©
294 3 org.fenixsoft.jit.Test£ºdoubleValue£¨4 bytes£©
295 1%org.fenixsoft.jit.Test£ºmain@5£¨20 bytes£©
@5 org.fenixsoft.jit.Test£ºcalcSum inline£¨hot£©
@9 org.fenixsoft.jit.Test£ºdoubleValue inline£¨hot£© |
´Ó´úÂëÊä³öÖпÉÒÔ¿´µ½·½·¨doubleValue£¨£©±»ÄÚÁª±àÒëµ½calcSum£¨£©ÖУ¬¶øcalcSum£¨£©ÓÖ±»ÄÚÁª±àÒëµ½·½·¨main£¨£©ÖУ¬ËùÒÔÐéÄâ»úÔÙ´ÎÖ´ÐÐmain£¨£©·½·¨µÄʱºò£¨¾ÙÀý¶øÒÑ£¬main£¨£©·½·¨²¢²»»áÔËÐÐÁ½´Î£©£¬calcSum£¨£©ºÍdoubleValue£¨£©·½·¨¶¼²»»áÔÙ±»µ÷Óã¬ËüÃǵĴúÂëÂß¼¶¼±»Ö±½ÓÄÚÁªµ½main£¨£©·½·¨ÖÐÁË¡£
³ýÁ˲鿴ÄÄЩ·½·¨±»±àÒëÖ®Í⣬»¹¿ÉÒÔ½øÒ»²½²é¿´¼´Ê±±àÒëÆ÷Éú³ÉµÄ»úÆ÷ÂëÄÚÈÝ£¬²»¹ýÈç¹ûÐéÄâ»úÊä³öÒ»´®0ºÍ1£¬¶ÔÓÚÎÒÃǵÄÔĶÁÀ´ËµÊÇûÓÐÒâÒåµÄ£¬»úÆ÷Âë±ØÐë·´»ã±à³É»ù±¾µÄ»ã±àÓïÑԲſÉÄܱ»ÔĶÁ¡£
ÐéÄâ»úÌṩÁËÒ»×éͨÓõķ´»ã±à½Ó¿Ú[1]£¬¿ÉÒÔ½ÓÈë¸÷ÖÖÆ½Ì¨Ïµķ´»ã±àÊÊÅäÆ÷À´Ê¹Óã¬ÈçʹÓÃ32λ80x86ƽ̨ÔòÑ¡ÓÃhsdis-i386ÊÊÅäÆ÷£¬ÆäÓàÆ½Ì¨µÄÊÊÅäÆ÷»¹ÓÐhsdis-amd64¡¢
hsdis-sparcºÍhsdis-sparcv9µÈ£¬¿ÉÒÔÏÂÔØ»ò×Ô¼º±àÒë³ö·´»ã±àÊÊÅäÆ÷[2]£¬È»ºó½«
Æä·ÅÖÃÔÚJRE/bin/client»ò/serverĿ¼Ï£¬Ö»ÒªÓëjvm.dllµÄ·¾¶Ïàͬ¼´¿É±»ÐéÄâ»úµ÷Óá£
ÔÚΪÐéÄâ»ú°²×°ÁË·´»ã±àÊÊÅäÆ÷Ö®ºó£¬¾Í¿ÉÒÔʹÓÃ-XX£º+PrintAssembly²ÎÊýÒªÇóÐéÄâ»ú´òÓ¡±àÒë·½·¨µÄ»ã±à´úÂëÁË
Èç¹ûûÓÐHSDIS²å¼þÖ§³Ö£¬Ò²¿ÉÒÔʹÓÃ-XX+PrintOptoAssembly£¨ÓÃÓÚServer
VM£©»ò-
XX£º+PrintLIR£¨ÓÃÓÚClient VM£©À´Êä³ö±È½Ï½Ó½ü×îÖÕ½á¹ûµÄÖмä´úÂë±íʾ£¬ ´ÓÔĶÁ½Ç¶ÈÀ´Ëµ£¬Ê¹ÓÃ-XX£º+PrintOptoAssembly²ÎÊýÊä³öµÄα»ã±à½á¹û°üº¬Á˸ü¶àµÄÐÅÏ¢£¨Ö÷ÒªÊÇ×¢ÊÍ£©£¬ÀûÓÚÔĶÁ²¢Àí½âÐéÄâ»úJIT±àÒëÆ÷µÄÓÅ»¯½á¹û¡£
±¾µØ»úÆ÷Âë·´»ã±àÐÅÏ¢
000 B1£º#N1£¼-BLOCK
HEAD IS JUNK Freq£º1
000 pushq rbp
subq rsp£¬#16#Create frame
nop#nop for patch_verified_entry
006 movl RAX,RDX#spill
008 sall RAX£¬#1
00a addq rsp£¬16#Destroy frame
popq rbp
testl rax£¬[rip+#offset_to_poll_page]#Safepoint£ºpoll
for GC
¡¡ |
Ç°ÃæÌáµ½µÄʹÓÃ-XX£º+PrintAssembly²ÎÊýÊä³ö·´»ã±àÐÅÏ¢ÐèÒªDebug»òÕßFastDebug°æµÄÐéÄâ»ú²ÅÄÜÖ±½ÓÖ§³Ö£¬Èç¹ûʹÓÃProduct°æµÄÐéÄâ»ú£¬ÔòÐèÒª¼ÓÈë²ÎÊý-XX£º
+UnlockDiagnosticVMOptions´ò¿ªÐéÄâ»úÕï¶Ïģʽºó²ÅÄÜʹÓá£
Èç¹û³ýÁ˱¾µØ´úÂëµÄÉú³É½á¹ûÍ⣬»¹ÏëÔÙ½øÒ»²½¸ú×Ù±¾µØ´úÂëÉú³ÉµÄ¾ßÌå¹ý³Ì£¬ÄÇ»¹¿ÉÒÔʹÓòÎÊý-XX£º+PrintCFGToFile£¨Ê¹ÓÃClient
Compiler£©»ò-XX£ºPrintIdealGraphFile£¨Ê¹ÓÃServer Compiler£©ÁîÐéÄâ»ú½«±àÒë¹ý³ÌÖи÷¸ö½×¶ÎµÄÊý¾Ý£¨ÀýÈ磬¶ÔC1±àÒëÆ÷À´Ëµ£¬°üÀ¨×Ö½ÚÂë¡¢
HIRÉú³É¡¢ LIRÉú³É¡¢ ¼Ä´æÆ÷·ÖÅä¹ý³Ì¡¢ ±¾µØ´úÂëÉú³ÉµÈÊý¾Ý£©Êä³öµ½ÎļþÖС£ È»ºóʹÓÃJava
HotSpot Client Compiler Visualizer £¨ÓÃÓÚ·ÖÎöClient Compiler£©»òIdeal
Graph Visualizer£¨ÓÃÓÚ·ÖÎöServer Compiler£©´ò¿ªÕâЩÊý¾ÝÎļþ½øÐзÖÎö¡£
Ideal Graph Visualizer¼ÓÔØideal.xmlÎļþºó£¬ÔÚOutlineÃæ°åÉϽ«ÏÔʾ³ÌÐòÔËÐйý³ÌÖбàÒë¹ýµÄ·½·¨Áбí,ÆäÖÐdoubleValue£¨£©·½·¨³öÏÖÁËÁ½´Î£¬ÕâÊÇÓÉÓڸ÷½·¨µÄ±àÒë½á¹û´æÔÚ±ê×¼±àÒëºÍOSR±àÒëÁ½¸ö°æ±¾¡£

Õ¹¿ª·½·¨¸ù½Úµã£¬¿ÉÒÔ¿´µ½ÏÂÃæÂÞÁÐÁË·½·¨ÓÅ»¯¹ý³ÌµÄ¸÷¸ö½×¶Î£¨¸ù¾ÝÓÅ»¯´ëÊ©µÄ²»Í¬£¬Ã¿¸ö·½·¨Ëù¾¹ýµÄ½×¶ÎÒ²»áÓÐËù²î±ð£©µÄIdealͼ£¬ÎÒÃÇÏÈ´ò¿ª¡°After
Parsing¡±Õâ¸ö½×¶Î¡£
JIT±àÒëÆ÷ÔÚ±àÒëÒ»¸öJava·½·¨Ê±£¬Ê×ÏÈÒª°Ñ×Ö½ÚÂë½âÎö³ÉijÖÖÖмä±íʾÐÎʽ£¬È»ºó²Å¿ÉÒÔ¼ÌÐø×ö·ÖÎöºÍÓÅ»¯£¬×îÖÕÉú³É´úÂë¡£
¡°After Parsing¡±¾ÍÊÇServer Compiler¸ÕÍê³É½âÎö£¬»¹Ã»ÓÐ×öÈκÎÓÅ»¯Ê±µÄIdealͼ±íʾ¡£
ÔÚ´ò¿ªÕâ¸öͼºó£¬¶ÁÕ߻ῴµ½ÆäÖÐÓкܶàÓÐÑÕÉ«µÄ
·½¿é£¬ÈçÏÂͼËùʾ¡£ ÿһ¸ö·½¿é¾Í´ú±íÁËÒ»¸ö³ÌÐòµÄ»ù±¾¿é£¨Basic Block£©£¬»ù±¾¿éµÄÌØµãÊÇÖ»ÓÐΨһµÄÒ»¸öÈë¿ÚºÍΨһµÄÒ»¸ö³ö¿Ú£¬Ö»Òª»ù±¾¿éÖеÚÒ»ÌõÖ¸ÁîÖ´ÐÐÁË£¬ÄÇô»ù±¾¿éÄÚËùÓÐÖ´Ðж¼»á°´ÕÕ˳Ðò½öÖ´ÐÐÒ»´Î¡£

doubleValue£¨£©·½·¨ËäȻֻÓмòµ¥µÄÁ½ÐÐ×Ö£¬µ«Êǰ´»ù±¾¿é»®·Öºó£¬ÐγɵÄͼÐνṹҪ±ÈÏëÏóÖи´Ôӵö࣬ÕâÒ»·½ÃæÊÇÒªÂú×ãJavaÓïÑÔËù¶¨ÒåµÄ°²È«ÐèÒª£¨ÈçÀàÐͰ²È«¡¢
¿ÕÖ¸Õë¼ì²é£©ºÍJavaÐéÄâ»úµÄÔË×÷ÐèÒª£¨ÈçSafepointÂÖѯ£©£¬ÁíÒ»·½ÃæÊÇÓÉÓÚÓÐЩ³ÌÐò´úÂëÖÐÒ»ÐÐÓï¾ä¾Í¿ÉÄÜÐγɺü¸¸ö»ù±¾¿é£¨ÀýÈçÑ»·£©¡£
¶ÔÓÚÀý×ÓÖеÄdoubleValue£¨£©·½·¨£¬Èç¹ûºöÂÔÓïÑÔ°²È«¼ì²éµÄ»ù±¾¿é£¬¿ÉÒÔ¼òµ¥Àí½âΪ°´Ë³ÐòÖ´ÐÐÁËÒÔϼ¸¼þÊÂÇ飺
1£©³ÌÐòÈë¿Ú£¬½¨Á¢Õ»Ö¡¡£
2£©ÉèÖÃj=0£¬½øÐÐSafepointÂÖѯ£¬Ìø×ªµ½4£©µÄÌõ¼þ¼ì²é¡£
3£©Ö´ÐÐj++¡£
4£©Ìõ¼þ¼ì²é£¬Èç¹ûj£¼100000£¬Ìø×ªµ½3£©¡£
5£©ÉèÖÃi=i*2£¬½øÐÐSafepointÂÖѯ£¬º¯Êý·µ»Ø¡£
ÒÔÉϼ¸¸ö²½Ö裬·´Ó³µ½Ideal Graph VisualizerµÄͼÉÏ£¬¾ÍÊÇÈçÏÂͼËùʾµÄÄÚÈÝ¡£

ÕâÑùÎÒÃÇÒª¿´¿ÕÑ»·ÊÇ·ñÓÅ»¯£¬»òÕߺÎʱÓÅ»¯£¬Ö»Òª¹Û²ì´ú±íÑ»·µÄ»ù±¾¿éÊÇ·ñÏû³ý£¬»òÕߺÎʱÏû³ý¾Í¿ÉÒÔÁË¡£
Òª¹Û²ìµ½ÕâÒ»µã£¬¿ÉÒÔÔÚOutlineÃæ°åÉÏÓÒ¼üµã»÷¡°Difference to current graph¡±£¬ÈÃÈí¼þ×Ô¶¯·ÖÎöÖ¸¶¨½×¶ÎÓ뵱ǰ´ò¿ªµÄIdealͼ֮¼äµÄ²îÒ죬Èç¹û»ù±¾¿é±»Ïû³ýÁË£¬½«»áÒÔºìÉ«ÏÔʾ¡£
¶Ô¡°After Parsing¡±ºÍ¡°PhaseIdealLoop 1¡±½×¶ÎµÄIdealͼ½øÐвîÒì·ÖÎö£¬·¢ÏÖÔÚ¡°PhaseIdealLoop1¡±½×¶ÎÑ»·²Ù×÷±»Ïû³ýÁË£¬ÈçÏÂͼËùʾ£¬ÕâÒ²¾Í˵Ã÷¿ÕÑ»·Êµ¼ÊÉÏÊDz»»á±»Ö´Ðеġ£

´Ó¡°After Parsing¡±½×¶Î¿ªÊ¼£¬Ò»Ö±µ½×îºóµÄ¡°Final Code¡±½×¶Î£¬¿ÉÒÔ¿´µ½doubleValue£¨£©·½·¨µÄIdealͼ´Ó·±µ½¼òµÄ±äǨ¹ý³Ì£¬ÕâÒ²ÊÇJavaÐéÄâ»úÔÚ¾¡Á¦ÓÅ»¯´úÂëµÄ¹ý³Ì¡£
µ½ÁË×îºóµÄ¡°Final Code¡±½×¶Î£¬²»½ö¿ÕÑ»·µÄ¿ªÏúÏû³ýÁË£¬Ðí¶àÓïÑÔ°²È«SafepointÂÖѯµÄ²Ù×÷Ò²Ò»ÆðÏû³ýÁË£¬ÒòΪ±àÒëÆ÷Åжϼ´Ê¹²»×öÕâЩ°²È«±£ÕÏ£¬ÐéÄâ»úÒ²²»»áÊܵ½Íþв¡£
×îºóÌáÐÑһ϶ÁÕߣ¬ÒªÊä³öCFG»òIdealGraphÎļþ£¬ÐèÒªÒ»¸öDebug°æ»òFastDebug°æµÄÐéÄâ»úÖ§³Ö£¬Product°æµÄÐéÄâ»úÎÞ·¨Êä³öÕâЩÎļþ¡£
|