AOTããã³JITã³ã³ãã€ã©
ããã»ããµã¯ãéãããäžé£ã®åœä»€ïŒãã·ã³ã³ãŒãïŒã®ã¿ãå®è¡ã§ããŸããããã°ã©ã ãããã»ããµã§å®è¡ããã«ã¯ãããã°ã©ã ããã·ã³ã³ãŒããšããŠè¡šãå¿ èŠããããŸãã
CãC ++ãªã©ã®ã³ã³ãã€ã«ãããããã°ã©ãã³ã°èšèªããããŸãããããã®èšèªã§æžãããããã°ã©ã ã¯ããã·ã³ã³ãŒããšããŠé åžãããŸããããã°ã©ã ãäœæãããåŸãç¹å¥ãªããã»ã¹ã§ããAhead-of-TimeïŒAOTïŒã³ã³ãã€ã©ãŒïŒéåžžã¯åã«ã³ã³ãã€ã©ãŒãšåŒã°ããŸãïŒãããœãŒã¹ã³ãŒãããã·ã³ã³ãŒãã«å€æããŸãããã·ã³ã³ãŒãã¯ãç¹å®ã®ããã»ããµã¢ãã«ã§å®è¡ããããã«èšèšãããŠããŸããå ±éã®ã¢ãŒããã¯ãã£ãæã€ããã»ããµã¯ãåãã³ãŒããå®è¡ã§ããŸããåŸã®ããã»ããµã¢ãã«ã¯éåžžãåã®ã¢ãã«ã®åœä»€ããµããŒãããŸããããã®éã¯ãµããŒãããŸãããããšãã°ãIntel Sandy Bridgeããã»ããµçšã®AVXåœä»€ã䜿çšãããã·ã³ã³ãŒãã¯ãå€ãIntelããã»ããµã§ã¯å®è¡ã§ããŸããããã®åé¡ã解決ããã«ã¯ãããŸããŸãªæ¹æ³ããããŸããããšãã°ãããã°ã©ã ã®éèŠãªéšåããã¡ã€ã³ããã»ããµã¢ãã«ã®ããŒãžã§ã³ãããã©ã€ãã©ãªã«è»¢éããŸããããããå€ãã®å Žåãããã°ã©ã ã¯æ¯èŒçå€ãããã»ããµã¢ãã«çšã«ã³ã³ãã€ã«ãããŠãããæ°ããåœä»€ã»ãããå©çšããŠããŸããã
ã³ã³ãã€ã«ãããããã°ã©ãã³ã°èšèªãšã¯å¯Ÿç §çã«ãPerlãPHPãªã©ã®è§£éãããèšèªããããŸãããã®ã¢ãããŒãã§ã¯ãã€ã³ã¿ãŒããªã¿ãŒãååšããä»»æã®ãã©ãããã©ãŒã ã§åããœãŒã¹ã³ãŒããå®è¡ã§ããŸãããã®ã¢ãããŒãã®æ¬ ç¹ã¯ãè§£éãããã³ãŒããåãããšãè¡ããã·ã³ã³ãŒããããé ãããšã§ãã
Javaèšèªã¯ãã³ã³ãã€ã«ãããèšèªãšè§£éãããèšèªã®éã®ã¯ãã¹ãšãããç°ãªãã¢ãããŒããæäŸããŸããJavaã¢ããªã±ãŒã·ã§ã³ã¯ãäžéã®äœã¬ãã«ã³ãŒãã§ãããã€ãã³ãŒãã«ã³ã³ãã€ã«ãããŸãã
åæäœã®ãšã³ã³ãŒãã«æ£ç¢ºã«1ãã€ãã䜿çšãããããããã€ãã³ãŒããšããååãéžæãããŸãããJava10ã«ã¯çŽ200ã®æäœããããŸãã
次ã«ããã€ãã³ãŒãã¯ãJVMããã³è§£éãããèšèªããã°ã©ã ã«ãã£ãŠå®è¡ãããŸãããã ãããã€ãã³ãŒãã®åœ¢åŒã¯æç¢ºã«å®çŸ©ãããŠãããããJVMã¯å®è¡æã«ããããã·ã³ã³ãŒãã«ã³ã³ãã€ã«ã§ããŸããåœç¶ãå€ãããŒãžã§ã³ã®JVMã¯ããã®åŸã®æ°ããããã»ããµåœä»€ã»ããã䜿çšããŠãã·ã³ã³ãŒããçæããããšã¯ã§ããŸãããäžæ¹ãJavaããã°ã©ã ãé«éåããããã«ãåã³ã³ãã€ã«ããå¿ èŠã¯ãããŸãããæ°ããJVMã§å®è¡ããã ãã§ååã§ãã
HotSpotJITã³ã³ãã€ã©
ããŸããŸãªJVMJITå®è£ ã¯ãããŸããŸãªæ¹æ³ã§ã³ã³ãã€ã©ãå®è£ ã§ããŸãããã®èšäºã§ã¯ãOracle HotSpotJVMãšãã®JITã³ã³ãã€ã©ã®å®è£ ã«ã€ããŠèª¬æããŸãã HotSpotãšããååã¯ãJVMããã€ãã³ãŒããã³ã³ãã€ã«ããããã«äœ¿çšããã¢ãããŒãã«ç±æ¥ããŠããŸããéåžžãã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã³ãŒãã®ããäžéšã®ã¿ãéåžžã«é »ç¹ã«å®è¡ãããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã¯äž»ã«ãããã®ç¹å®ã®éšåã®å®è¡é床ã«äŸåããŸããã³ãŒãã®ãããã®éšåã¯ãããã¹ããããšåŒã°ããJITã³ã³ãã€ã©ãã³ã³ãã€ã«ãããã®ã§ãããã®ã¢ãããŒãã®æ ¹åºã«ã¯ããã€ãã®å€æããããŸããã³ãŒãã1åã ãå®è¡ãããå Žåããã®ã³ãŒãã®ã³ã³ãã€ã«ã¯æéã®ç¡é§ã§ãããã1ã€ã®çç±ã¯æé©åã§ãã JVMãã³ãŒããå®è¡ããåæ°ãå€ãã»ã©ãJVMãèç©ããçµ±èšãå€ããªããããã䜿çšããŠãããæé©åãããã³ãŒããçæã§ããŸããããã«ãã³ã³ãã€ã©ã¯ä»®æ³ãã·ã³ã®ãªãœãŒã¹ãã¢ããªã±ãŒã·ã§ã³èªäœãšå ±æããããããããã¡ã€ãªã³ã°ãšæé©åã«è²»ãããããªãœãŒã¹ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³èªäœãå®è¡ã§ããŸããããã«ãããäžå®ã®ãã©ã³ã¹ãå®ãããŸãã HotSpotã³ã³ãã€ã©ã®äœæ¥åäœã¯ãã¡ãœãããšã«ãŒãã§ãã
ã³ã³ãã€ã«ãããã³ãŒãã®åäœã¯nmethodïŒãã€ãã£ãã¡ãœããã®ç¥ïŒãšåŒã°ããŸãã
éå±€åã³ã³ãã€ã«
å®éãHotSpot JVMã«ã¯1ã€ã§ã¯ãªããC1ãšC2ã®2ã€ã®ã³ã³ãã€ã©ããããŸããä»ã®ååã¯ã¯ã©ã€ã¢ã³ããšãµãŒããŒã§ããæŽå²çã«ãC1ã¯GUIã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšãããC2ã¯ãµãŒããŒã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšãããŠããŸãããã³ã³ãã€ã©ã¯ãã³ãŒãã®ã³ã³ãã€ã«ãéå§ããé床ãç°ãªããŸããC1ã¯ã³ãŒãã®ã³ã³ãã€ã«ãé«éåãå§ããŸãããC2ã¯ããæé©åãããã³ãŒããçæã§ããŸãã
以åã®ããŒãžã§ã³ã®JVMã§ã¯ãã¯ã©ã€ã¢ã³ãã®-clientãã©ã°ãš -serverãŸãã¯-d64ã䜿çšããŠã³ã³ãã€ã©ãéžæãã å¿ èŠããã ãŸããããµãŒããŒã«ãŒã çšãJDK 6ã§ã¯ããã«ãã¬ãã«ã³ã³ãã€ã«ã¢ãŒããå°å ¥ãããŸããã倧ãŸãã«èšãã°ããã®æ¬è³ªã¯ãè§£éãããã³ãŒãããã³ã³ãã€ã©C1ãæ¬¡ã«C2ã«ãã£ãŠçæãããã³ãŒããžã®é 次é·ç§»ã«ãããŸããJDK 8ã§ã¯ã-clientã-serverãããã³-d64ãã©ã°ã¯ç¡èŠãããJDK 11ã§ã¯ã-d64ãã©ã°ãåé€ããããšã©ãŒãçºçããŸãã-XXïŒ-TieredCompilationãã©ã°ã䜿çšããŠãéå±€åã³ã³ãã€ã«ã¢ãŒãããªãã«ã§ããŸã ã
5ã€ã®ã³ã³ãã€ã«ã¬ãã«ããããŸãã
- 0-è§£éãããã³ãŒã
- 1-C1ã¯å®å šã«æé©åãããŠããŸãïŒãããã¡ã€ãªã³ã°ãªãïŒ
- 2-ã¡ãœããåŒã³åºããšã«ãŒãååŸ©ã®æ°ãèæ ®ããC1-
- 3-ãããã¡ã€ãªã³ã°ã䜿çšããC1-
- 4-C2
ã¬ãã«éã®é·ç§»ã®å žåçãªã·ãŒã±ã³ã¹ã衚ã«ç€ºããŸãã
| ã·ãŒã±ã³ã¹
|
説æ
|
|---|---|
| 0-3-4 | éèš³ãã¬ãã«3ãã¬ãã«4ãæãäžè¬çã |
| 0-2-3-4 | , 4 (C2) . 2. , 3 , , 4. |
| 0-2-4 | , 3 . 4 3. 2 4. |
| 0-3-1 | . 3, , 4 . 1. |
| 0-4 | . |
Code cache
JITã³ã³ãã€ã©ã«ãã£ãŠã³ã³ãã€ã«ããããã·ã³ã³ãŒãã¯ãã³ãŒããã£ãã·ã¥ãšåŒã°ããã¡ã¢ãªé åã«æ ŒçŽãããŸãããŸããã€ã³ã¿ãŒããªã¿ãŒã³ãŒããªã©ãä»®æ³ãã·ã³èªäœã®ãã·ã³ã³ãŒããæ ŒçŽãããŸãããã®ã¡ã¢ãªé åã®ãµã€ãºã¯å¶éãããŠããããã£ã±ãã«ãªããšã³ã³ãã€ã«ã忢ããŸãããã®å Žåãäžéšã®ãããããã¡ãœããã¯åŒãç¶ãã€ã³ã¿ãŒããªã¿ãŒã«ãã£ãŠå®è¡ãããŸãããªãŒããŒãããŒãçºçããå ŽåãJVMã¯æ¬¡ã®ã¡ãã»ãŒãžã衚瀺ããŸãã
Java HotSpot(TM) 64-Bit Server VM warning: CodeCache is full. Compiler has been disabled.
ãã®ã¡ã¢ãªé åã®ãªãŒããŒãããŒãèŠã€ããå¥ã®æ¹æ³ã¯ãã³ã³ãã€ã©æäœã®ãã®ã³ã°ãæå¹ã«ããããšã§ãïŒãããè¡ãæ¹æ³ã«ã€ããŠã¯ä»¥äžã§èª¬æããŸãïŒã
ã³ãŒããã£ãã·ã¥ã¯ãJVMã®ä»ã®ã¡ã¢ãªé åãšåãæ¹æ³ã§æ§æã§ããŸããåæãµã€ãºã¯ã-XXïŒInitialCodeCacheSizeãã©ã¡ãŒã¿ãŒã§æå®ãã ãŸããæå€§ãµã€ãºã¯ã-XXïŒReservedCodeCacheSizeãã©ã¡ãŒã¿ãŒã§æå®ãããŸã ãããã©ã«ãã§ã¯ãåæãµã€ãºã¯2496KBã§ããæå€§ãµã€ãºã¯ãéå±€åã³ã³ãã€ã«ããªãã®å Žåã¯48 MBããªã³ã®å Žåã¯240MBã§ãã
Java 9以éãã³ãŒããã£ãã·ã¥ã¯3ã€ã®ã»ã°ã¡ã³ãã«åå²ãããŠããŸãïŒåèšãµã€ãºã¯äžèšã®å¶éã«ãã£ãŠå¶éãããŠããŸãïŒã
- JVM internal (non-method code). , JVM, , . . 5.5 MB. -XX:NonNMethodCodeHeapSize.
- Profiled code. . non-method code . 21.2 MB 117.2 MB . -XX:ProfiledCodeHeapSize.
- Non-profiled code. . non-method code . 21.2 MB 117.2 MB . -XX: NonProfiledCodeHeapSize.
-XXïŒ+ PrintCompilationãã©ã°ã䜿çšããŠã³ã³ãã€ã«ããã»ã¹ã®ãã°ãæå¹ã«ã§ããŸã ïŒããã©ã«ãã§ã¯ç¡å¹ã«ãªã£ãŠããŸãïŒããã®ãã©ã°ãèšå®ãããŠããå ŽåãJVMã¯ãã¡ãœãããŸãã¯ã«ãŒããã³ã³ãã€ã«ããããã³ã«ãæšæºåºåïŒSTDOUTïŒã«ã¡ãã»ãŒãžãæžã蟌ã¿ãŸããã»ãšãã©ã®ã¡ãã»ãŒãžã®åœ¢åŒã¯æ¬¡ã®ãšããã§ããtimestampcompilation_id屿§tiered_levelmethod_name sizedeoptã
ã¿ã€ã ã¹ã¿ã³ããã£ãŒã«ãã¯ãJVMã®éå§ããã®æéã§ãã
compile_idãã£ãŒã«ãã¯ãåé¡ã®å éšIDã§ããéåžžãã¡ãã»ãŒãžããšã«é çªã«å€§ãããªããŸãããé åºãçã£ãŠããå ŽåããããŸããããã¯ãè€æ°ã®ã³ã³ãã€ã«ã¹ã¬ããã䞊è¡ããŠå®è¡ãããŠããå Žåã«çºçããå¯èœæ§ããããŸãã
屿§ãã£ãŒã«ãã¯ãã³ã³ãã€ã«ãããã³ãŒãã«é¢ããè¿œå æ å ±ãéã¶5æåã®ã»ããã§ããããããã®å±æ§ã該åœããªãå Žåã¯ã代ããã«ã¹ããŒã¹ã衚瀺ãããŸããæ¬¡ã®å±æ§ãååšããŸãã
- ïŒ -OSRïŒãªã³ã¹ã¿ãã¯çœ®æïŒ;
- s-ã¡ãœããã¯åæãããŸãã
- ïŒ-ã¡ãœããã«ã¯äŸå€ãã³ãã©ãŒãå«ãŸããŠããŸãã
- b-ã³ã³ãã€ã«ã¯ããããã³ã°ã¢ãŒãã§çºçããŸããã
- n-ã³ã³ãã€ã«ãããã¡ãœããã¯ããã€ãã£ãã¡ãœããã®ã©ãããŒã§ãã
OSRã¯ãªã³ã¹ã¿ãã¯çœ®æã®ç¥ã§ããã³ã³ãã€ã«ã¯éåæããã»ã¹ã§ããã¡ãœãããã³ã³ãã€ã«ããå¿ èŠããããšJVMã倿ãããšããã®ã¡ãœããã¯ãã¥ãŒã«å ¥ããããŸããã¡ãœãããã³ã³ãã€ã«ãããŠããéãJVMã¯ã€ã³ã¿ãŒããªã¿ãŒã«ãã£ãŠã¡ãœãããå®è¡ãç¶ããŸããæ¬¡åã¡ãœãããå床åŒã³åºããããšãã³ã³ãã€ã«ãããããŒãžã§ã³ãå®è¡ãããŸããé·ããµã€ã¯ã«ã®å Žåãã¡ãœããã®å®äºãåŸ ã€ããšã¯å®çšçã§ã¯ãããŸãã-ããã¯ãŸã£ããå®äºããªããããããŸããã JVMã¯ã«ãŒãã®æ¬äœãã³ã³ãã€ã«ããã³ã³ãã€ã«ãããããŒãžã§ã³ã®å®è¡ãéå§ããå¿ èŠããããŸãã JVMã¯ãã¹ã¬ããã®ç¶æ ãã¹ã¿ãã¯ã«æ ŒçŽããŸããåŒã³åºãããã¡ãœããããšã«ãæ°ããStack Frameãªããžã§ã¯ããã¹ã¿ãã¯äžã«äœæãããã¡ãœãããã©ã¡ãŒã¿ãããŒã«ã«å€æ°ãæ»ãå€ãããã³ãã®ä»ã®å€ãæ ŒçŽãããŸãã OSRäžã«ãåã®ã¹ã¿ãã¯ãã¬ãŒã ã眮ãæããããã«æ°ããã¹ã¿ãã¯ãã¬ãŒã ãäœæãããŸãã
åºå žïŒ Java HotSpotTMä»®æ³ãã·ã³ã¯ã©ã€ã¢ã³ãã³ã³ãã€ã©ïŒãã¯ãããžãšã¢ããªã±ãŒã·ã§ã³
ãsãããã³ãïŒã屿§èª¬æã¯å¿ èŠãªããšæããŸãã
ãbã屿§ã¯ãã³ã³ãã€ã«ãããã¯ã°ã©ãŠã³ãã§è¡ãããªãã£ãããšãæå³ããææ°ããŒãžã§ã³ã®JVMã§ã¯æ€åºãããªãã¯ãã§ãã
ãnã屿§ã¯ãã³ã³ãã€ã«ãããã¡ãœããããã€ãã£ãã¡ãœããã®ã©ãããŒã§ããããšãæå³ããŸãã
tiered_levelãã£ãŒã«ãã«ã¯ãã³ãŒããã³ã³ãã€ã«ãããã¬ãã«çªå·ãå«ãŸããŸããéå±€åãããã³ã³ãã€ã«ãç¡å¹ã«ãªã£ãŠããå Žåã¯ç©ºã«ããããšãã§ããŸãã
method_nameãã£ãŒã«ãã«ã¯ãã³ã³ãã€ã«ãããã¡ãœããã®ååãŸãã¯ã³ã³ãã€ã«ãããã«ãŒããå«ãã¡ãœããã®ååãå«ãŸããŸãã
ãµã€ãºãã£ãŒã«ãã«ã¯ãçµæã®ãã·ã³ã³ãŒãã®ãµã€ãºã§ã¯ãªããã³ã³ãã€ã«ããããã€ãã³ãŒãã®ãµã€ãºãå«ãŸããŸãããµã€ãºã¯ãã€ãåäœã§ãã
deoptãã£ãŒã«ãã¯ãã¹ãŠã®ã¡ãã»ãŒãžã«è¡šç€ºãããããã§ã¯ãªããå®è¡ãããæé©åè§£é€ã®ååãå«ãŸãããmadenotentrantãããmadezombieããªã©ã®ã¡ãã»ãŒãžãå«ãŸããå ŽåããããŸãã
次ã®ãšã³ããªããã°ã«è¡šç€ºãããå ŽåããããŸããtimestampcompile_idCOMPILESKIPPEDïŒreasonãããã¯ãã¡ãœããã®ã³ã³ãã€ã«æã«åé¡ãçºçããããšãæå³ããŸãããããäºæ³ãããå ŽåããããŸãã
- ã³ãŒããã£ãã·ã¥ããã£ã±ãã§ã-ã³ãŒããã£ãã·ã¥ã¡ã¢ãªé åã®ãµã€ãºãå¢ããå¿ èŠããããŸãã
- åæã¯ã©ã¹ããŒãã£ã³ã°-ã¯ã©ã¹ã¯ã³ã³ãã€ã«æã«å€æŽãããŸããã
ã³ãŒããã£ãã·ã¥ã®ãªãŒããŒãããŒãé€ããŠããã¹ãŠã®å Žåã§ãJVMã¯åã³ã³ãã€ã«ã詊ã¿ãŸããããã§ãªãå Žåã¯ãã³ãŒããåçŽåããŠã¿ãŠãã ããã
ããã»ã¹ã-XXïŒ+ PrintCompilationãã©ã°ãªãã§éå§ãããå ŽåãjstatãŠãŒãã£ãªãã£ã䜿çšããŠã³ã³ãã€ã«ããã»ã¹ã確èªã§ããŸã ã Jstatã«ã¯ãã³ã³ãã€ã«æ å ±ã衚瀺ããããã®2ã€ã®ãªãã·ã§ã³ããããŸãã -compiler
ãã©ã¡ãŒã¿ãŒ ã¯ãã³ã³ãã€ã©ãŒæäœã®èŠçŽã衚瀺ããŸãïŒ5003ã¯ããã»ã¹IDã§ãïŒã
% jstat -compiler 5003 Compiled Failed Invalid Time FailedType FailedMethod 206 0 0 1.97 0
ãã®ã³ãã³ãã¯ãã³ã³ãã€ã«ã«å€±æããã¡ãœããã®æ°ãšæåŸã®ãã®ãããªã¡ãœããã®ååã衚瀺ããŸãã -printcompilation
ãã©ã¡ãŒã¿ãŒ ã¯ãæåŸã«ã³ã³ãã€ã«ãããã¡ãœããã«é¢ããæ å ±ãåºåããŸãã2çªç®ã®ãã©ã¡ãŒã¿ãŒã§ããæäœã®ç¹°ãè¿ãæéãšçµã¿åããããšãã³ã³ãã€ã«ããã»ã¹ãçµæçã«èгå¯ã§ããŸããæ¬¡ã®äŸã§ã¯ã-printcompilationã³ãã³ããæ¯ç§ïŒ1000msïŒå®è¡ããŸãã
% jstat -printcompilation 5003 1000 Compiled Size Type Method 207 64 1 java/lang/CharacterDataLatin1 toUpperCase 208 5 1 java/math/BigDecimal$StringBuilderHelper getCharArray
第äºéšã®èšç»
次ã®ããŒãã§ã¯ãJVMãã³ã³ãã€ã«ãéå§ããã«ãŠã³ã¿ãŒã®ãããå€ãšããããã倿Žããæ¹æ³ã«ã€ããŠèª¬æããŸãããŸããJVMãã³ã³ãã€ã©ã¹ã¬ããã®æ°ãéžæããæ¹æ³ã倿Žããæ¹æ³ãããã³ãã€å®è¡ããå¿ èŠããããã«ã€ããŠã説æããŸããæåŸã«ãJITã³ã³ãã€ã©ã«ãã£ãŠå®è¡ãããæé©åã®ããã€ããç°¡åã«èŠãŠã¿ãŸãããã
åèæç®ãšãªã³ã¯
- Javaã®ããã©ãŒãã³ã¹ïŒJava 8ã11ãããã³ãã以éã®ãã¥ãŒãã³ã°ãšããã°ã©ãã³ã°ã«é¢ãã詳现ãªã¢ããã€ã¹ãScott Oaks ISBNïŒ978-1-492-05611-9ã
- Javaã®æé©åïŒJVMã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæ¹åããããã®å®çšçãªææ³ãBenjamin J. EvansãJames Goughãããã³ChrisNewlandãISBNïŒ978-1-492-02579-5ã
- JEP 197ïŒã»ã°ã¡ã³ãåãããã³ãŒããã£ãã·ã¥
- Java HotSpotTMä»®æ³ãã·ã³ã¯ã©ã€ã¢ã³ãã³ã³ãã€ã©ïŒãã¯ãããžãšã¢ããªã±ãŒã·ã§ã³