ïŒããããã¹ãããã®ãœãŒã¹ã³ãŒããè€è£œããŸãããäžç·ã«èŠãŠã¿ãŸããããã·ãªãŒãºããã®æçš¿ïŒãã«ãã¹ã¬ããã®åé¡ïŒããã©ãŒãã³ã¹ãŸãã¯ãããŸããªãã€ãŒã³ããã°ïŒã«çŽé¢ããŠãããã¹ãŠã®äººã¯ããããã解決ããéçšã§ãå¿
ç¶çã«ã€ã³ãã¬ãŒã·ã§ã³ãç«¶åãã¡ã³ããŒããã€ã¢ã¹ããã¯ãã¹ã¬ããããŒãã³ã°ãªã©ã®çšèªã«ééããŸãã ãããã誰ãããããã®çšèªã®èåŸã«é ãããŠãããã®ãæ¬åœã«ç¥ã£ãŠããŸããïŒ æ®å¿µãªãããå®è·µã瀺ãããã«ã
ãã¹ãŠã§ã¯ãã
ãŸãã ã
ç¶æ³ãä¿®æ£ããããšãæåŸ
ããŠãç§ã¯ãã®ãããã¯ã«é¢ããäžé£ã®èšäºãæžãããšã«ããŸããã ãããã¯ããããã
ãæåã«çè«çã«äœãèµ·ããã¹ãããç°¡åã«èª¬æããæ¬¡ã«ãœãŒã¹ã«è¡ããããã§ã©ããªãããèŠãããšããååã«åºã¥ããŠæ§ç¯ãããŸãã ãããã£ãŠãæåã®éšåã¯Javaã ãã§ãªããäž»ã«é©çšå¯èœã§ãããããä»ã®ãã©ãããã©ãŒã ã®éçºè
ã¯èªåã«ãšã£ãŠæçãªãã®ãèŠã€ããããšãã§ããŸãã
詳现ãªèª¬æãèªãåã«ãJavaã¡ã¢ãªã¢ãã«ã«ç²ŸéããŠããããšã確èªããŠãããšåœ¹ç«ã¡ãŸãã ããšãã°ãSergey
Walrus Kuksenkoã®
ã¹ã©ã€ãããç§ã®
åæã®ãããã¯ã§åŠç¿ã§ã
ãŸã ã ãŸããã¹ã©ã€ãïŒ38ããå§ãŸããã®
ãã¬ãŒã³ããŒã·ã§ã³ã¯çŽ æŽãããè³æã§ãã
çè«çæå°å€
ãåãã®ããã«ãjavaã®åãªããžã§ã¯ãã«ã¯ç¬èªã®
monitorããããããåãC ++ãšã¯ç°ãªããåå¥ã®mutex-sã䜿çšããŠãªããžã§ã¯ããžã®ã¢ã¯ã»ã¹ãä¿è·ããå¿
èŠã¯ãããŸããã ãããŒã®çžäºæé€ãšåæã®å¹æãå®çŸããã«ã¯ãæ¬¡ã®æäœã䜿çšãããŸãã
- monitorenter ïŒãã£ããã£ãç£èŠããŸãã äžåºŠã«1ã€ã®ã¹ã¬ããã®ã¿ãã¢ãã¿ãŒãææã§ããŸãã ãã£ããã£ã®è©Šè¡æã«ã¢ãã¿ãŒãããžãŒã®å Žåããã£ããã£ããããšããã¹ã¬ããã¯è§£æŸããããŸã§åŸ
æ©ããŸãã ãã®å Žåããã¥ãŒã«ã¯è€æ°ã®ã¹ã¬ãããååšããå¯èœæ§ããããŸãã
- monitorexit ïŒç¡æã®ã¢ãã¿ãŒ
- wait ïŒçŸåšã®ã¹ã¬ãããã¢ãã¿ãŒã®ããããåŸ
æ©ã»ããã«ç§»åãã
notify
çºçãåŸ
æ©ããŸãã wait
ã¡ãœããã®çµäºãfalseã§ããå¯èœæ§ããããŸãã ã¢ãã¿ãŒãææããã¹ã¬ããwait
ãšãä»ã®ã¹ã¬ãããã¢ãã¿ãŒãåŒãç¶ãããšãã§ããŸãã - notify ïŒallïŒ ïŒçŸåšã¢ãã¿ãŒã®åŸ
æ©ã»ããã«ããã¹ã¬ããã®1ã€ïŒãŸãã¯ãã¹ãŠïŒãèµ·åããŸãã å¶åŸ¡ãååŸããã«ã¯ãç®èŠããã¹ããªãŒã ãã¢ãã¿ãŒãæ£åžžã«ãã£ããã£ããå¿
èŠããããŸãïŒmonitorenterïŒ
ç¶è¡ããåã«ãéèŠãªæŠå¿µãå®çŸ©ããŸãã
ç«¶å -è€æ°ã®ãšã³ãã£ãã£ãåæã«åããªãœãŒã¹ãææããããšããç¶æ³ãæä»ç䜿çšãç®çãšããŠããŸã
ã¢ãã¿ãŒã®ææã«ç«¶åããããšããäºå®ã¯ãã¢ãã¿ãŒã®ãã£ããã£æ¹æ³ã«å€§ããäŸåããŸãã ã¢ãã¿ãŒã®ç¶æ
ã¯æ¬¡ã®ãšããã§ãã
- init ïŒã¢ãã¿ãŒã¯äœæãããã°ããã§ããããŸã§èª°ããã£ããã£ããŠããŸãã
- ãã€ã¢ã¹ ïŒïŒ ã¹ããŒãæé©åãããã«ã¯ã»ã©é ãããã«èŠããŸããïŒã¢ãã¿ãŒã¯ãããããã£ããã£ããæåã®ã¹ã¬ããçšã«ãäºçŽããããŠããŸãã å°æ¥ããã®ã¹ããªãŒã ã¯ãã£ããã£ããã®ã«é«äŸ¡ãªæäœãå¿
èŠãšããããã£ããã£ã¯éåžžã«è¿
éã«è¡ãããŸãã ãã£ããã£ãå¥ã®ã¹ããªãŒã ãçæããããšãããšãã¢ãã¿ãŒã¯ãã®ã¹ããªãŒã ã®ããã«äºçŽãããŸãïŒ rebias ïŒããŸãã¯ã¢ãã¿ãŒãã·ã³ç¶æ
ã«ãªããŸãïŒ ãã€ã¢ã¹ãåãæ¶ããŸã ïŒã ã¢ãã¿ãŒããã£ããã£ãŒããããšããŠãããªããžã§ã¯ãã®ã¯ã©ã¹ã®ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã«å³åº§ã«äœçšãã远å ã®æé©åããããŸãïŒ äžæ¬åãæ¶ã/ãã€ã¢ã¹ ïŒ
- thin ïŒè€æ°ã®ã¹ããªãŒã ãã¢ãã¿ãŒããã£ããã£ããããšããŸãããç«¶åã¯ãããŸããïŒã€ãŸããåæã«ãã£ããã£ããããéåžžã«å°ããªãªãŒããŒã©ããã§ãã£ããã£ãããããããšã¯ãããŸããïŒ ã ãã®å Žåããã£ããã£ã¯æ¯èŒçå®äŸ¡ãªCASã䜿çšããŠå®è¡ãããŸãã ç«¶åãçºçãããšãã¢ãã¿ãŒã¯èšåŒµç¶æ
ã«å
¥ããŸã
- fat / inflated ïŒãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¬ãã«ã§åæãè¡ãããŸãã ã¹ããªãŒã ã¯ãã¢ãã¿ãŒããã£ããã£ããé çªã«ãªããŸã§åŸ
æ©ããŠã¹ãªãŒãããŸãã ã³ã³ããã¹ãã倿Žããã³ã¹ããå¿ãããšããŠããã¹ã¬ãããå¶åŸ¡ãååŸãããšãã¯ãã·ã¹ãã ã·ã§ãã©ãŒã«ãäŸåãããããå¿
èŠä»¥äžã«æéãããããŸãã ç«¶åãè§£æ¶ããããšãã¢ãã¿ãŒã¯èãç¶æ
ã«æ»ãå ŽåããããŸã
ãã®æœè±¡çãªæšè«ã§çµããããããã¹ãããã§ã®å®è£
æ¹æ³ã«æ²¡é ããŠããŸãã
ãªããžã§ã¯ãããããŒ
ä»®æ³ãã·ã³å
ã®ãªããžã§ã¯ãããããŒã«ã¯ãéåžžã
ããŒã¯ã¯ãŒããšãªããžã§ã¯ãã¯ã©ã¹ãžã®ãã€ã³ã¿ãŒ
ãšãã 2ã€ã®ãã£ãŒã«ããå«ãŸããŸãã ç¹å¥ãªå Žåã«ã¯ãããšãã°é
åã®é·ããªã©ãããã«äœãã远å ã§ããŸãã ãããã®ããããŒã¯ããããã
oop ïŒéåžžã®ãªããžã§ã¯ããã€ã³ã¿ãŒïŒã«æ ŒçŽããããã¡ã€ã«
hotspot/src/share/vm/oops/oop.hpp
ã§ãã®æ§é ãèŠãããšãã§ããŸãã åããã©ã«ããŒã«ãã
markOop.hpp
ãã¡ã€ã«ã«èšè¿°ãããŠããããŒã¯ã¯ãŒããšã¯äœãããã詳ãã調ã¹ãŸãã
ïŒ oopDesc
ããã®ç¶æ¿ã«ã¯æ³šæãæããªãã§ãã ããïŒããã¯æŽå²çãªçç±ã®ã¿ã§ãïŒè¯ãæ¹æ³ã§ã詳现ãªã³ã¡ã³ãã«æ³šæãæã£ãŠæ³šææ·±ãèªãå¿
èŠããããŸãããããŸãèå³ããªã人ã®ããã«ããã®ããŒã¯ã®å
容ã®ç°¡åãªèª¬æã以äžã«ç€ºããŸãåèªãå«ãŸããŠãããšã©ã®ãããªå Žåã«ã
ãã®ãã¬ãŒã³ããŒã·ã§ã³ã¯ã90çªç®ã®ã¹ã©ã€ãããåŒãç¶ãèŠãããšãã§ããŸãã
åèªã®å
容ãããŒã¯ãã
ç¶æ
| ã¿ã°ä»ã | å
容 |
ããã¯ãããŠããªããèããåã£ãŠããªã | 01 | Identity hashcode | age | 0 |
ããã¯ãããèããåãããªã | 00 | mark word |
èšããã | 10 | |
åã£ã | 01 | id - | epoch | age | 1 |
gcã®ããŒã¯ | 11 | |
ããã«ããã€ãã®æ°ããæå³ããããŸãã ãŸãã
IDããã·ã¥ã³ãŒãã¯ã
System.identityHashCode
åŒã³åºããããšãã«è¿ããããªããžã§ã¯ãã®ããã·ã¥ã³ãŒãã§ãã 第äºã«ã
幎霢ã¯ãªããžã§ã¯ããçãæ®ã£ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®æ°ã§ãã ãŸãããã®ãªããžã§ã¯ãã®ã¯ã©ã¹ã®ãã«ã¯å€±å¹ãŸãã¯ãã«ã¯ãã€ã¢ã¹ã®æ°ã瀺ã
ãšããã¯ããããŸãã ãããå¿
èŠãªçç±ã«ã€ããŠã¯ãåŸã§èª¬æããŸãã
ãã€ã¢ã¹ã®å Žåãã¢ã€ãã³ãã£ãã£ããã·ã¥ã³ãŒããšthreadID +ãšããã¯ã®äž¡æ¹ã«ååãªã¹ããŒã¹ãåæã«ãªãããšã«æ°ã¥ããŸãããïŒ ãããŠãããã¯ããã§ãããããããè峿·±ãçµæããããŸãïŒãããã¹ãããã§ã¯ã System.identityHashCode
ãåŒã³åºããšããªããžã§ã¯ãã®åãæ¶ããã€ã¢ã¹ãçºçããŸãã
ããã«ãã¢ãã¿ãŒãããžãŒã®å Žå
ãããŒã¯ã¯ãŒãã¯ãå®éã®ããŒã¯ã¯ãŒããä¿åãããŠãã
ããŒã¯ã¯ãŒãã«ä¿åãããŸãã åã¹ã¬ããã®ã¹ã¿ãã¯ã«ã¯ãããŸããŸãªãã®ãæ ŒçŽãããããã€ãã®ãã»ã¯ã·ã§ã³ãããããŸãã ããã¯ã¬ã³ãŒããä¿åããããã®ã«èå³ããããŸãã ããã§ããªããžã§ã¯ãã®ããŒã¯ã¯ãŒãã軜éããã¯ã§ã³ããŒããŸãã ãããã£ãŠãã¡ãªã¿ã«ãã·ã³ããã¯ããããªããžã§ã¯ãã¯
ã¹ã¿ãã¯ããã¯ãšåŒã°ã
ãŸã ã è
«ããã¢ãã¿ãŒã¯ãèšåŒµããã¹ããªãŒã ãšãã·ãã¯ã¢ãã¿ãŒã®ã°ããŒãã«ããŒã«ã®äž¡æ¹ã«ä¿åã§ããŸãã
ããã§ã¯ãã³ãŒãã«è¡ããŸãããã
synchronized
ã䜿çšããç°¡åãªäŸ
ãã®ã¯ã©ã¹ããå§ããŸãããïŒ
1 2 3 4 5 6 7 | public class SynchronizedSample { void doSomething() { synchronized(this) { |
ãããäœã«ã³ã³ãã€ã«ãããããèŠãŠãã ããïŒ
javac SynchronizedSample.java && javap -c SynchronizedSample
å®å
šãªãªã¹ãã¯æäŸããŸãããã
doSomething
ã¡ãœããã®æ¬äœã䜿çšããŠãã³ã¡ã³ããæäŸããŸãã
void doSomething(); Code: 0: aload_0
ããã§ã¯ã
monitorenter
ããã³
monitorexit
èå³ããã
monitorenter
ã ãã¡ãããããªããéžãã
Yandexæ€çŽ¢ãšã³ãžã³ã§åœŒããããŠããããšãæ€çŽ¢ããããšã¯ã§ããŸãããããã¯èª€ã£ãæ
å ±ã«æºã¡ãŠãããã©ããããããæªãæ¹æ³ã§ã¯ãããŸããã ããã«ãOpenJDKã®ãœãŒã¹ãæå
ã«ããã®ã§ã
äžè¬çã«æ¥œããããšãã§ããŸã ã ãããã®ãœãŒã¹ã§ã¯ãè§£éã¢ãŒãã®ãã€ãã³ãŒãã§äœãèµ·ããããèŠãã®ã¯éåžžã«ç°¡åã§ãã èŠåã1ã€ã ããããŸã
ãLeshaTheShade Shipilev
㯠次ã®ããã«
è¿°ã¹ãŠããŸãã
äžè¬ã«ãäžéšã®ã¢ã¯ã·ã§ã³ã®VMãã«ããŒã®ã³ãŒãã¯ãJITã«ãã£ãŠè²Œãä»ãããããã®ãšå
容ãç°ãªãå ŽåããããŸãã JITã®äžéšã®æé©åãã€ã³ã¿ãŒããªã¿ãŒã«ç§»æ€ãããªãå¯èœæ§ãããç¹ãŸã§
ãŸãããªã§ãŒã·ã£ã¯PrintAssemblyãèªåã®æ¯ã«å
¥ããŠãã³ã³ãã€ã«æžã¿ã®jitã³ãŒãåãããã³ãŒãã確èªããããšãæšå¥šããŸããããæµæãå°ãªããã¹ããå§ããŠãããã
æ¬åœã«tmã§ãããã確èªããããšã«ããŸãã
ã¢ãã¿ãŒ
ã€ã³ã¿ããªã¿ã®ãœãŒã¹ã¯
hotspot/src/share/vm/interpreter
ã«ããããããã®å€ãããããŸãã ãã®æ®µéã§ãã¹ãŠãèªã¿çŽãããšã¯ããŸããå§ãã§ããŸãããgrepã䜿çšãããšãå¿
èŠãªå ŽæãèŠã€ããå¯èœæ§ãããããã§ãã ãŸãã
bytecodes.hpp
ãš
bytecodes.cpp
çºè¡šãèŠã䟡å€ããããŸãã
./bytecodes.hpp:235: _monitorenter = 194, // 0xc2 ./bytecodes.cpp:489: def(_monitorenter, "monitorenter", "b", NULL, T_VOID, -1, true);
ç°¡åã«æšæž¬ã§ããããã«ããã€ãã³ãŒã
.hpp
人éã®åæå®æ°ã¯
.hpp
ã§å®çŸ©ããããã®æäœã¯defã¡ãœããã䜿çšããŠ
.cpp
ç»é²ãããŸãã ãã®èšäºã®ãã¬ãŒã ã¯ãŒã¯ã§ããã«ã€ããŠåå¥ã«è©±ãæå³ã¯ãããŸããïŒmonitorenterã³ãã³ãã
monitorenter
ãŠããããšãæç¢ºã«ããã ãã§ååã§ããããã¯ããã©ã¡ãŒã¿ãŒïŒ
b
ïŒã®ãªãåäžã®ãã€ãã³ãŒãã§ãããäœãè¿ãããã¹ã¿ãã¯ãã1ã€ã®å€ãåŒãåºããããã¯ãåŒã³åºããããã»ãŒããã€ã³ããåŒã³åºãããããããšãã§ããŸãïŒåŸè
ã«ã€ããŠã¯åŸã§ïŒã
以äžã¯ã
bytecodeInterpreter.cpp
ãã¡ã€ã«ã«é¢ä¿ããŸãã ãã°ããã
BytecodeInterpreter::run(interpreterState istate)
ã¡ãœãã
BytecodeInterpreter::run(interpreterState istate)
ãããã¯çŽ2200è¡ããå¿
èŠãšãããéåžžãåŠçãããã¡ãœããã®æ¬äœãçµäºãããŸã§ã«ãŒãã§å転ããŸãã ïŒå®éãå¥ã®å€§ããªéšåã¯ãã¡ãœããã®åæåãã¡ãœããã
synchronized
å Žåã®ããã¯ãªã©ãä»ã®æçšãªãã®ãæ±ããŸãïŒã æåŸã«ãè¡
1667
ããã
monitorenter
æäœãçºçãããšãã«äœãèµ·ãããã
monitorenter
ãŸãã ãŸããã¹ããªãŒã ã¹ã¿ãã¯ã«ç¡æã®ã¢ãã¿ãŒãããïŒãªãå Žåã¯
istate->set_msg(more_monitors)
ã䜿çšããŠã€ã³ã¿ãŒããªã¿ãŒããèŠæ±ãã
istate->set_msg(more_monitors)
ãããã¯è§£é€ãããããŒã¯ã¯ãŒãã®ã³ããŒãããã«é
眮ãããŸãã ãã®åŸãCASã䜿çšããŠããªããžã§ã¯ãã®ããŒã¯ã¯ãŒãã«ãã®ã³ããŒãžã®ãã€ã³ã¿ãŒãæžã蟌ãããšããŸããããã¯ã
displaced headerãšåŒã°ããŸãã
CAS-æ¯èŒãšäº€æ- *dest
ãšcompare_value
ååçã«æ¯èŒããçããå Žåã¯*dest
ãšexchange_value
å Žæã§æ¯èŒexchange_value
ãŸãã åæå€*dest
è¿ãããŸãã ïŒåæã«ãäž¡é¢membarã¯ä¿èšŒãããŸãããæ¬¡ã®èšäºã§ãããã«ã€ããŠè©³ãã説æããŸãïŒ
CASãæåããå Žåãåå©ïŒããã³ããã«ãã£ãŠã¢ãã¿ãŒïŒã¯ç§ãã¡ã®ãã®ã§ãããããã§çµäºã§ããŸãïŒã¿ã°ã¯ã眮ãæããããããããŒãžã®ãã€ã³ã¿ãŒèªäœã«å«ãŸããŠããŸã-æé©åïŒã ããã§ãªãå Žåã¯ã次ã«é²ã¿ãŸãããæåã«éèŠãªç¹ã«æ³šæãæããŸãã
ãã®ã¢ãã¿ãŒã«ãã€ã¢ã¹ãããã£ãŠãããã©ããã確èªããŸããã§ãã ã Lyoshinã®èŠåãæãåºããŠãéèš³ã«ã¯å±ããªãæé©åã«åºäŒã£ãããšãããããŸãã ãšããã§ã
synchronized
ã¡ãœãããåŠçãããšãããã¹ãŠãæ£åžžã«ãã§ãã¯ãããŸãããããã¯å°ãåŸã§ãã
CASã倱æããå Žåãã¢ãã¿ãŒã®ææè
ã§ãããã©ããã確èªããŸãïŒååž°ãã£ããã£ïŒã ãããããªããæåã¯åã³ç§ãã¡ã®ãã®ã§ãããç§ãã¡ãããããšã¯ã¹ã¿ãã¯ã®
NULL
眮ãæããããããããŒã«æžã蟌ãããšã ãã§ãïŒåŸã§ãããå¿
èŠãªçç±ãããããŸãïŒã ãã以å€ã®å Žåã¯ã次ã®åŒã³åºããè¡ããŸãã
CALL_VM(InterpreterRuntime::monitorenter(THREAD, entry), handle_exception)
ãã¯ã
CALL_VM
ã¯ããã¬ãŒã ã®äœæãªã©ãããããçš®é¡ã®æè¡çãªæäœãå®è¡ãã転éãããæ©èœãå®è¡ããŸãã ç§ãã¡ã®å Žåããã®é¢æ°ã¯
InterpreterRuntime::monitorenter
ã§ãããããã¯æ°ãã
interpreterRuntime.cpp
ãã¡ã€ã«ã«ãããŸãã
monitorenter
ã¡ãœããã¯ã
UseBiasedLocking
ã
UseBiasedLocking
ããŠãããã©ããã«å¿ããŠã
ObjectSynchronizer::fast_enter
ãŸãã¯
ObjectSynchronizer::slow_enter
ãŸãã æåã®ãã®ããå§ããŸãããã
fast_enter
ãŸãããã®ãããªæé©åã®é©åæ§ã«é¢ããããã€ãã®èšèã IBM Research Labsã®äžéšã®æ±äº¬ã®ç§åŠè
ã¯ãæªç¥ã®æ¹æ³ã§çµ±èšãèšç®ããå®éãã»ãšãã©ã®å Žåãåæã¯ç«¶åããªãããšãçºèŠããŸããã ããã«ãããã«åŒ·åãªå£°æãææ¡ãããŸãããã»ãšãã©ã®ãªããžã§ã¯ãã®ã¢ãã¿ãŒã¯ãçæ¶¯ãéããŠ1ã€ã®ã¹ããªãŒã ã®ã¿ã§ãã£ããã£ãããŸãã ãããŠãåãã®ããããã¯ã®ã¢ã€ãã¢ãçãŸããŸãããæåã«èµ·ãã人ãããããããŠã¹ãªããã§ãã ãã€ã¢ã¹ããã¯ã®è©³çްã«ã€ããŠã¯ãããšãã°
ãããã®ã¹ã©ã€ãã§èªãããšãã§ããŸãïŒãã ããå€å°å€ããªã£ãŠããŸãïŒããããã¹ãããã®ãœãŒã¹ã«æ»ããŸãã ããã§ããã¡ã€ã«
src/share/vm/runtime/synchronizer.cpp
ã«èå³ããããŸãã169è¡ç®ããå§ã
src/share/vm/runtime/synchronizer.cpp
ãæåã«ãèªåèªèº«ã«ãã€ã¢ã¹ããããããŸããããªãå Žåã¯ãåãæ¶ããè¡ããéåžžã®thin slow_enterã«ç§»åããŸãã æ¥œèгçãªè©Šã¿ã¯ã
biasedLocking.cpp
ãã¡ã€ã«ã«ãã
BiasedLocking::revoke_and_rebias
ã§çºçããŸãã ãã詳现ã«èª¬æããŸãããã
- Rebias-ã¢ãã¿ãŒããã°ãããã£ããã£ããæš©å©ãçä¿ããã¹ããªãŒã ã®å€æŽã åçŽãªå Žåã«èš±å¯ãããŸããããšãã°ãã¢ãã¿ãŒãå®éã«ãã£ããã£ã§ããªãã£ãå ŽåïŒ å¿åãã€ã¢ã¹ ïŒããŸãã¯ãã€ã¢ã¹ãåã®æä»£ããä¿æãããŠããå ŽåïŒç¹å®ã®ã¯ã©ã¹ã®äžæ¬åãæ¶ãã®åæ°ã以äžãåç
§ïŒãæ¬è³ªçã«ã¯åæ§ã§ã誰ããã€ã¢ã¹ãç£èŠããŠããªãã ããã«ãfast_enterãåŒã³åºããšãã«
fast_enter
å®å
šã«ç¡å¹ã«ããããšãã§ããŸãïŒ attempt_rebias = false
ïŒã - åãæ¶ã -ã¢ãã¿ãŒã®ãã€ã¢ã¹ããã¯ãç¡å¹ã«ããŸãã ã»ãšãã©ã®å Žåãç¹ã«
attempt_rebias
false
èšå®ãããŠããå Žåã«äœ¿çšããfalse
ã çŸåšãã¢ãã¿ãŒãå¥ã®ã©ã€ãã¹ããªãŒã ã«ãã£ãŠææãããŠããå Žåãrebiasã¯ãã®ã¹ã¬ãããsafepointã§åæ¢ããããšãèŠæ±ããŸãããã®åŸããã®ã¹ããªãŒã ã®ã¹ã¿ãã¯ã調㹠ãããã«æ ŒçŽãããã¢ãã¿ãŒããããŒããã€ã¢ã¹ãªãã«ä¿®æ£ããŸãã - ãã«ã¯ãªãã€ã¢ã¹ -ãã®ã¯ã©ã¹ã®ãã¹ãŠã®çããŠããã€ã³ã¹ã¿ã³ã¹ãšåŸã®ã€ã³ã¹ã¿ã³ã¹ã®ãªãã€ã¢ã¹ã ãã®æä»£ã®ç¹å®ã®ã¯ã©ã¹ã®åãæ¶ããŸãã¯ãªãã€ã¢ã¹ã®æ°ãBiasedLockingBulkRebiasThresholdãè¶
ãããš
BiasedLockingBulkRebiasThreshold
ãŸãã ã°ããŒãã«ã»ãŒããã€ã³ãã§å®è¡ãããæä»£ã®å€åãåŒãèµ·ãããŸãã - äžæ¬åãæ¶ã -ãã®ã¯ã©ã¹ã®ãã¹ãŠã®çããŠããŠå²ãåœãŠãããåŸã®ã€ã³ã¹ã¿ã³ã¹ãåãæ¶ããŸãã ãã®æä»£ã®ç¹å®ã®ã¯ã©ã¹ã®å€±å¹ãŸãã¯ãªãã€ã¢ã¹ã®åæ°ãBiasedLockingBulkRevokeThresholdãè¶
ãããš
BiasedLockingBulkRevokeThreshold
ãŸãã ã°ããŒãã«ã»ãŒããã€ã³ãã§å®è¡ãããæä»£ã®å€åãåŒãèµ·ãããŸãã
ç§ã¯
ç¥ã£ãŠãããã tmãå¿ããŠããŸã£ã人ã
ã«æãåºãããŸãã
safepoint-ã¹ã¬ããã®å®è¡ãå®å
šãªå Žæã§åæ¢ããŠããä»®æ³ãã·ã³ã®ç¶æ
ã ããã«ãããã¹ã¬ãããçŸåšææããŠããã¢ãã¿ãŒã®ãã€ã¢ã¹ã®åãæ¶ããæé©åè§£é€ãã¹ã¬ãããã³ãã®ååŸãªã©ã䟵å
¥çãªæäœãå¯èœã«ãªããŸãã
ãã®å Žåã
attempt_rebias
ãã©ã¡ãŒã¿ãŒã¯åžžã«
true
ãããšãã°VMã¹ã¬ããããã®åŒã³åºãã®å Žåãªã©ã
false
ã«ãªãããšããããŸãã
ãæ³åã®ãšããããã«ã¯æäœã¯ãã¹ã¬ããéã§å€æ°ã®ãªããžã§ã¯ããç°¡åã«è»¢éã§ããããã«ããããã®ããªãããŒãªæé©åã§ãã ãã®æé©åããªãã£ãå Žåãããã©ã«ãã§
UseBiasedLocking
ãæå¹ã«ããã®ã¯å±éºã§ãããªããªããã¢ããªã±ãŒã·ã§ã³ã®å€§ããªã¯ã©ã¹ã¯å€±å¹ãšåãã€ã¢ã¹ãæ°žé ã«åŠçããããã§ãã
ã¹ããªãŒã ããã°ãããã£ããã£ã§ããªãïŒã€ãŸããåãæ¶ããã€ã¢ã¹ãè¡ãããïŒå Žåã¯ãã·ã³ããã¯ã®ãã£ããã£ã«é²ã¿ãŸãã
slow_enter
ããã§èå³ã®ããã¡ãœããã¯ã
src/share/vm/runtime/synchronizer.cpp
ãã¡ã€ã«ã«ãããŸãã ããã«ããã€ãã®ã·ããªãªããããŸãã
- ã±ãŒã¹1ã ãè¯ãã ïŒãªããžã§ã¯ãã®ã¢ãã¿ãŒã¯çŸåšç¡æã§ãã æ¬¡ã«ãCASã䜿çšããŠå æããããšããŸãã CASã¯æ¢ã«ã¢ãŒããã¯ãã£ã«äŸåããïŒéåžžã¯ããã»ããµã«ãã£ãŠãã€ãã£ãã«ãµããŒããããïŒåœä»€ã§ãããããããã«æ·±ãããæå³ã¯ãããŸããã ïŒRuslanïŒã¯åœŒã«ã±ã¬ãã³ãã³ãŠã£ãŒããäžããŸããã ãç§ã¯ãMOSãã©ã³ãžã¹ã¿ã®ãœãŒã¹ã·ã³ã¯å
ã®é»åã®æµãã«å°éããªãã£ãããšinããŸãã ã ïŒ CASãæåãããšãåå©ïŒã¢ãã¿ãŒããã£ããã£ãããŸãã ããã倱æãããšãæ²ãã¿ã«æºãããã3çªç®ã®ã±ãŒã¹ã«é²ã¿ãŸãã
- ã±ãŒã¹2ããè¯å¥œãã§ãããªããžã§ã¯ãã®ã¢ãã¿ãŒã¯ç¡æã§ã¯ãããŸããããçŸåšãã£ããã£ããããšããŠããåãã¹ããªãŒã ã§ããžãŒã§ãã ããã¯ååž°çãªãã£ããã£ã§ãã ãã®å Žåãç°¡åã«ããããã«ãã¹ã¿ãã¯NULLã®ãã£ã¹ãã¬ã€ã¹ãããããããŒã«æžã蟌ã¿ãŸããããã¯ã以åã«ãã®ã¢ãã¿ãŒãæ¢ã«ãã£ããã£ããã¹ã¿ãã¯ã«é¢ããæ
å ±ããã§ã«æã£ãŠããããã§ãã
- ã±ãŒã¹3ã ãæªããèšåŒµ ïŒã ããã倱æããããªãã¯ãèŠããããšãã詊ã¿ã¯ãã¹ãŠå€±æããŸããããããŠãäžåãªãŠãŒã¶ãŒèšèªãèŠããŠãã»ã°ã¡ã³ããŒã·ã§ã³éåã«é¥ã以å€ã«ããããšã¯ãããŸããã ãã åè«ã ãã ãããµããã£é¢ã«ã€ããŠã¯äœãèšããŸããã§ãããOSã¬ãã«ã®ããªããã£ãã«é Œã£ãŠãæ£çŽã«ãè¡åããªããã°ãªããªãå Žåã ã¢ãã¿ãŒãèšããã ãšèšããŸãã ã³ãŒãã§ã¯ããã®åäœã¯
ObjectSynchronizer::inflate
ã§èª¬æãããŠããŸãããããã§ã¯ããŸã泚æããŸãããå®éããã®ã¡ãœããã¯ã¹ã¬ããã»ãŒãã§ãããããã€ãã®æè¡çãªåŸ®åŠãªç¹ãèæ
®ããŠããã©ã°ãã¢ãã¿ãŒã«èšå®ããŸãã
ã¢ãã¿ãŒãèšããŸããåŸãã¢ãã¿ãŒã«å
¥ãå¿
èŠããããŸãã ObjectMonitor::enter
ã¡ãœããã¯ãŸãã«ãããè¡ããèããããªãèããããªããã¹ãŠã®ããªãã¯ãé©çšããŠãã¹ããªãŒã ã®ObjectMonitor::enter
ãåé¿ããŸãã ãããã®ããªãã¯ã«ã¯ããæ³åã®ãšããã1åéãã®CAS-sããã®ä»ã®ãããªãŒã¡ãœãããã䜿çšããŠãã¹ãã³ã«ãŒãã䜿çšããŠãã£ããã£ã詊ã¿ãããšãå«ãŸããŸãã ã¡ãªã¿ã«ãã³ã¡ã³ããšäœãèµ·ãã£ãŠããã®ããšã®éã«ããããªççŸãèŠã€ãã£ãããã§ãã äžåºŠã¹ãã³ã«ãŒãã§ã¢ãã¿ãŒã«å
¥ãããšãããšãäžåºŠã ãè¡ããšäž»åŒµããŸãã
352 353 354 355 356 357 358 359 360 361 362 363 | // Try one round of spinning *before* enqueueing Self // and before going through the awkward and expensive state // transitions. The following spin is strictly optional ... // Note that if we acquire the monitor from an initial spin // we forgo posting JVMTI events and firing DTRACE probes. if (Knob_SpinEarly && TrySpin (Self) > 0) { assert (_owner == Self , "invariant") ; assert (_recursions == 0 , "invariant") ; assert (((oop)(object()))->mark() == markOopDesc::encode(this), "invariant") ; Self->_Stalled = 0 ; return ; } |
ãããŠãããã§ããå°ããåŒã³åºãããenterI
ã¡ãœããã§ãããäžåºŠå®è¡ããŸãã
485 486 487 488 489 490 491 492 493 494 495 496 497 | |
ããŠããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¬ãã«ã§ã®é§è»ã¯éåžžã«æãã®ã§ãã»ãšãã©äœã§ããããåé¿ããæºåãã§ããŠããŸãã 圌女ã®äœãã²ã©ãã®ãèŠãŠã¿ãŸãããã
é é§è»ã¹ããªãŒã
ããªãåã«æžããã³ãŒãã«è¿ã¥ããŠãããšèšããªããã°ãªããŸããããããã¯é¡èã§ãã å€ãã®è€è£œããªãšã³ãžãã¢ãªã³ã°ããã®ä»ã®èšåããããŸãã ãã ããããã®æŸèæãåãé€ããŠãããããããçµã¿åãããŠããªã©ã®ã³ã¡ã³ãã®ååšã¯å°ãå®å¿ã§ãã
ããã§ã¯ãé§è»ã¹ããªãŒã ãšã¯æ£ç¢ºã«ã¯äœã§ããïŒ åã¢ãã¿ãŒã«ã¯ããããEntry List ïŒ Waitsetãšæ··åããªãã§ãã ãã ïŒãããããšã誰ããèããããšãããã¯ãã§ãã ã¢ãã¿ãŒãžã®äœäŸ¡æ Œã§ã®å
¥å詊è¡ããã¹ãŠå€±æããåŸããã®ç¹å®ã®ãã¥ãŒã«èªåèªèº«ã远å ãããã®åŸãé§è»ããŸãã
591 592 593 594 595 596 597 598 599 600 601 | // park self if (_Responsible == Self || (SyncFlags & 1)) { TEVENT (Inflated enter - park TIMED) ; Self->_ParkEvent->park ((jlong) RecheckInterval) ; // Increase the RecheckInterval, but clamp the value. RecheckInterval *= 8 ; if (RecheckInterval > 1000) RecheckInterval = 1000 ; } else { TEVENT (Inflated enter - park UNTIMED) ; Self->_ParkEvent->park() ; } |
é§è»å Žã«çŽæ¥ç§»åããåã«ãçŸåšã®ã¹ããªãŒã ã«è²¬ä»»ããããã©ããã«å¿ããŠãããã§æéã調æŽã§ãããã©ããã確èªããŸãã 責任ã®ãããããŒã¯åžžã«1ã€ã ãã§ãããããããã¹ãã©ã³ãã£ã³ã°ãåé¿ããããã«å¿
èŠã§ããã¢ãã¿ãŒã空ããŠãããšãã®æ²ãã¿ã§ãããåŸ
æ©ã»ããå
ã®ãã¹ãŠã®ãããŒã¯ãŸã åŸ
æ©ããŠãããå¥è·¡ãåŸ
ã£ãŠããŸãã æ
åœè
ããããšããåœŒã¯æã
èªåçã«ç®ãèŠãŸããŸãïŒããå€ãã®ç¡é§ãªç®èŠããèµ·ãã-ç®èŠããåŸãããã¯ãååŸã§ããŸããã§ãã-é§è»æéã¯é·ããªããŸãã1000msãè¶
ããªãããšã«æ³šæããŠãã ããïŒã æ®ãã®ãããŒã¯ãå°ãªããšãæ°žé ã«ç®èŠããåŸ
ã€ããšãã§ããŸãã
ããã§ã¯ãé§è»ã®æ¬è³ªã«ç§»ããŸãããã ãã§ã«çè§£ããŠããããã«ãããã¯ã«wait/notify
ãwait/notify
Javaéçºè
ã«äŒŒãã»ãã³ãã£ã¯ã¹äžã®ãã®ã§ããããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¬ãã«ã§çºçããŸãã ããšãã°ãLinuxããã³bsdã§ã¯ããæ³åã®ãšãããPOSIXã¹ã¬ããã䜿çšãããŸããPOSIXã¹ã¬ããã§ã¯ã pthread_cond_timedwait
ïŒãŸãã¯pthread_cond_wait
ïŒãåŒã³åºãããã¢ãã¿ãŒãè§£æŸãããã®ãåŸ
ã¡ãŸãã ãããã®ã¡ãœããã¯ãLinuxã¹ã¬ããã®ã¹ããŒã¿ã¹ãWAITINGã«å€æŽããäœããã®ã€ãã³ããçºçãããšãã«ã·ã¹ãã ã¹ã±ãžã¥ãŒã©ã«ãŠã§ã€ã¯ã¢ããããããã«èŠæ±ããŸãïŒãã ãããã®ã¹ã¬ããã責任ãè² ãã®ã¯äžå®æéåŸãŸã§ã§ãïŒã
OSã¬ãã«ã®ã¹ã¬ããã¹ã±ãžã¥ãŒãªã³ã°
ããã§ã¯ãLinuxã«ãŒãã«ã調ã¹ãŠãããã§ã¹ã±ãžã¥ãŒã©ãŒãã©ã®ããã«æ©èœããããèŠãŠã¿ãŸãããã ãåç¥ã®ããã«ãLinuxãœãŒã¹ã¯gitã«ãããæ¬¡ã®ããã«ã·ã§ããŒãã¯ããŒã³ã§ããŸãã
git clone git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-rt.git
ãã©ã«ãã«è¡ããŸããã...ããããŸãããããããŸãããåè«ã§ãã ãœãŒã¹ã³ãŒãã®è¡ã«å¯ŸããŠæ£ç¢ºãªLinuxã·ã§ããŒããã€ã¹ã®æ©èœã¯ãåçŽãªsynchronized
ãããã¯ããå§ããç¡å®³ãªèšäºã«ã¯æ¢ã«æ·±ãããŸããããŒãã³ã¢ãæžããããã«ãã·ã§ããŒãäžè¬çã«ã©ã®ããã«æ©èœãããã説æããŸãã linux, . - , , : â , . â quantum â , , , . linux , 10-200 , 1 . windows , 2-15 , â 10 15 .
, , , . , , (, - I/O-), , - . - . , , , -, , .
, , , â . , , , , , , .
, , : , â , . : , , -, .
, , , . , contention, .
monitorexit
ãã€ã¢ã¹ããã¯ã®å Žåãåºæ¬çã«ã¯äœãããŸããã眮ãæããããããããŒã«ã¯NULLãæ ŒçŽãããŠããããšãããããçµäºããŸããããã¯è峿·±ãç¹ã§ããçŸåšå æãããŠããªããã€ã¢ã¹ããã¯ãè§£é€ããããšãããšãã€ã³ã¿ãŒããªã¿ãŒã¯ã¹ããŒãããŸããIllegalMonitorStateException
ïŒãã ãããã€ãã³ãŒãæ€èšŒã¯ãã®ãããªããšãç£èŠããŸãïŒãåãã®ãªãããã¯ã®å ŽåããåŒã³åºããŸãInterpreterRuntime::monitorexit
ãããã€ãã®ãã§ãã¯ã®åŸïŒããšãã°ãã¢ãã¿ãŒãå®éã«ããã¯ãããŠãããã©ãããããã§ãªãå Žåã¯ã¹ããŒãããŸãIllegalMonitorStateException
ïŒãåŒã³åºããObjectSynchronizer::slow_exit
ãŸãfast_exit
ããœãŒã¹ãèªãå Žåãé«éãã¹ã«é¢ããã³ã¡ã³ãã«æ³šæãæã£ãŠã¯ãããŸããããã®æ¹æ³ã§ã¯ã次ã®ã·ããªãªãå¯èœã§ããã¢ãã¿ãŒãã¹ã¿ãã¯ããã¯ç¶æ
ã«ãªã£ãŠãããèšåŒµãŸãã¯èšåŒµãæåã®ã±ãŒã¹ã§ã¯ããã¹ãŠãåçŽã§ãããªããžã§ã¯ãããããŒãããã¯åã®ç¶æ
ã«æ»ããçµäºããŸãã 2çªç®ã®ã±ãŒã¹ã§ã¯ã誰ããã¢ãã¿ãŒã®èšãã¿ãçµããŠ3çªç®ã®ã±ãŒã¹ã«é²ãã®ãåŸ
ã¡ãŸãã3çªç®ã®ã±ãŒã¹ã§ã¯ãããã¯ãè§£é€ããèãé²åºããŸãããã®åŸãçŸåšããã¯ãååŸããæºåãã§ããŠããé§è»ã¹ããªãŒã ããããã©ããã確èªããŸããããã¯ã圌ãç®ãèŠãŸããŠãããšãã°TrySpin
ïŒäžèšãåç
§ïŒã䜿çšããŠã¢ãã¿ãŒããã£ããã£ããããšããå Žåã«å¯èœã§ãããããèŠã€ãã£ãå Žåãããã«é¢ããäœæ¥ã¯å®äºããŸããããã¯ãåãåãããã¹ã¬ããã®ãã¥ãŒã空ã®å Žåãå®äºããŸãããã®ãããªãããŒããªãå Žåã¯ãããªã·ãŒã«å¿ããŠïŒã䜿çšããŠèšå®Knob_QMode
ãæ£çŽãªãšããããã®å€ã0
ããã©ã«ãèšå®ããå€åããåäžã®å ŽæãèŠã€ããŠããŸããããã ããç¥èã®ãã人tmã¯ãããããããã°ãšãã¥ãŒãã³ã°ã®æ®ãã§ããå¯èœæ§ãé«ãããšã瀺åããŠããŸãïŒãæåã«ç®ãèŠãŸã人ãéžæããŸãããããã¯æè¿ç®èŠããã¹ããªãŒã ãããããŸããããéã«æè¿ç®èŠããã¹ããªãŒã ãããããŸãããçãäžé£ã®åŒã³åºãã®åŸããã©ãããã©ãŒã åºæã®ã³ãŒããèŠã€ããŸãos::PlatformEvent::unpark()
ããã®ã³ãŒãã¯ãç®çã®ã¹ããªãŒã ã«ä¿¡å·ãäŒããŸããããšãã°ãlinuxãšbsdã䜿çšããpthread_cond_signal
ãŸããå®éãããŸã詳ãã説æããªããã°ãã¢ãã¿ãŒã®ãªãªãŒã¹ã«ã€ããŠèšããããšã¯ããã ãã§ããNBïŒsynchronized
ã¡ãœãã
次ã®ããã«å
ã®Javaã³ãŒããèšè¿°ããå ŽåïŒ synchronized void doSomething() {
ãã®ã¡ãœããã®ãã€ãã³ãŒãã¯èããçããªããŸãïŒ synchronized void doSomething(); Code: 0: return
ã€ã³bytecodeInterpreter.cpp
synchronized
ã¡ãœããã¯ãè¡ããåŠçãããŸã767
ããã§ãã¯ãããif (METHOD->is_synchronized())
ãŸãããã®æ¡ä»¶ã®å
éšã«ã¯ãif
åãã®ããããã¯ã«é¢é£ããèšå€§ãªæ°ã®ããããŸããããã¯ãæäœãåŠçãããšãã«çªç¶è¡šç€ºãããªãã£ããã®monitorenter
ã§ããäžè¬ã«ãåã«èª¬æããããšãè¡ãããŠããŸãããææè
ã¹ã¬ããã«ãããã€ã¢ã¹ã®ããã£ãã¢ãã¿ãŒã®ïŒCASãªãã®ïŒè¿
éãªãã£ããã£ããŸã ãããŸãããŸããã¡ãœããæ¬äœã®å®è¡ãçµäºããåŸãã¡ãœãããåæããããšã¢ãã¿ãŒã¯çµäºããŸããåŸ
ã£ãŠéç¥ãã
ãããã®ã¡ãœããã®åŠçã¯ãsynchronizer.cpp
377è¡ç®ããå§ãŸããŸããã€ã³ã¿ããªã¿ã§åŸ
æ©/éç¥ããŠããã¢ãã¿ãŒã¯ããããã®ã¡ãœãããæåã«è¡ãããšã§èšããŸããã®ã§ãèšããŸããå¿
èŠããããŸãããã®åŸã圌ãã¯åœŒã®ã¡ãœããwait
ãŸãã¯ãåŒã³åºããŸãnotify
ãæåã®1ã€ã¯ãåŸ
æ©ã»ããïŒå®éã«ã¯ã¿ãŒã³ïŒã«è¿œå ããããŠã§ã€ã¯ã¢ããããæéã«ãªããŸã§åŸ
æ©ããŸãïŒåŸ
æ©ããããã«èŠæ±ãããæéãçµéããŸãããäžæãŸãã¯éç¥ãšåŒã°ãã人ãããŸããïŒãNotify
åŸ
æ©ã»ãããã1ã€ã®ã¹ããªãŒã ããã«ããããªã·ãŒã«å¿ããŠãã¢ãã¿ãŒããã£ããã£ããã人ã®ãã¥ãŒã®ããå Žæã«è¿œå ããŸããNotifyAll
å
šå¡ãåŸ
æ©ã»ããããæãåºããšããç¹ã§ã®ã¿ç°ãªããŸããã¡ã¢ãªå¹æ
JMMã«ç²ŸéããŠãã人ã¯ãåãã¢ãã¿ãŒããã£ããã£ããåã«ã¢ãã¿ãŒã®ãªãªãŒã¹ãè¡ãããããšãç¥ã£ãŠããŸããã·ã³ã®å Žåãããã¯CASã«ãã£ãŠä¿èšŒãããŸããèšããã å Žåãããã¯æç€ºçãªåŒã³åºãã«ãã£ãŠä¿èšŒãããŸãOrderAccess::fence();
ã
ã¢ãã¿ãŒãåã£ãŠããå Žåãããã¯1ã€ã®ã¹ã¬ããã®ã¿ãã¢ãã¿ãŒã䜿çšããããšãæå³ããŸãããã®å®è¡ã¯ãã§ã«ããã°ã©ã ã®é åºã§ä¿èšŒãããŠããŸããHBãåãæ¶ããšãmonitorexitã®æäžïŒã¹ããªãŒã ãçããŠããå ŽåïŒïŒãã§ã«èããèšåŒµããŠããïŒããŸãã¯å
¥åãããšãïŒãããèããèšåŒµããŠããïŒã衚瀺ãããŸããHBãä¿èšŒããããã«ãåŸ
æ©ãçµäºããçŽåã«æç€ºçãªãã§ã³ã¹ãèšå®ãããŸããMajor O. aka Disclaimer ããã®ã³ã¡ã³ã
å®éãtmããã¹ãŠã¯ç§ãã¡ãèããŠããããã«ã¯èµ·ãããŸãããããšãã°ãJITãã³ãŒãããã€ãã£ãã«ã³ã³ãã€ã«ããå ŽåããŸãã¯ãä»ã®ä»®æ³ãã·ã³ã§äœæ¥ããå Žåããã ããããããã¹ãããã®ã€ã³ã¿ãŒããªã¿ãŒããšããåçŽãªã±ãŒã¹ã§ããã¹ãŠãå®éã«ç§ãããã§æžããæ¹æ³ã§ããããšãä¿èšŒããããšã¯ã§ããŸããããæ¥œãã¿ã«
次ã®ã·ãªãŒãºã§ã¯ããŸããã¡ã¢ãªãŒããªã¢ã«ã€ããŠèª¬æããå¿
èŠããããŸããããã¯ãJMMã§çºçåãæäŸããããã«éåžžã«éèŠã§ãããããã¯volatile
ãä»åŸè¡ããã£ãŒã«ãã®äŸã«ã€ããŠæ€èšããã®ã«éåžžã«äŸ¿å©ã§ããæçµãã£ãŒã«ããšå®å
šãªåºçç©ã«ã泚æãæã䟡å€ããããŸãããTheShadeãšchereminã¯ãã§ã«ãããã® èšäºã§ããããã«ããŒããŠããã®ã§ãèªæžã«èå³ã®ãã人ã«ããããèªãããšãã§ããŸãïŒæ
éã«ã®ã¿ïŒããããŠæåŸã«ãJITãå
¥ã£ãŠãããšãã®éãã«ã€ããŠãPrintAssemblyã§ãã£ã±ãã®ã¹ããŒãªãŒãåŸ
ã€ããšãã§ããŸãããããŠããäžã€Â©
æ
è¡ãç¹°ãè¿ããã人ã®ããã«ïŒjdk7uã®144f8a1a43cbãªããžã§ã³ã䜿çšããŸããããªããžã§ã³ãç°ãªãå Žåãè¡çªå·ãç°ãªãå ŽåããããŸã-K.O.ãã€ã¢ã¹ããã¯ã¯ãä»®æ³ãã·ã³ã®èµ·åçŽåŸã§ã¯ãªããBiasedLockingStartupDelay
ããªç§ïŒããã©ã«ãã§ã¯4000ïŒåŸã«ãªã³ã«ãªããŸããããã¯ãããã§ãªãå Žåãä»®æ³ãã·ã³ã®èµ·åãšåæåãã¯ã©ã¹ã®ããŒãããã®ä»ãã¹ãŠã®ããã»ã¹ã§ãçããŠãããªããžã§ã¯ãã®äžå®ã®åãæ¶ããã€ã¢ã¹ãåå ã§èšå€§ãªæ°ã®ã»ãŒããã€ã³ãã衚瀺ãããããã§ãããã¹ãŠã®ã»ãŒããã€ã³ãã§ãã¡ãœããã¯ObjectSynchronizer::deflate_idle_monitors
äœãããŠããããéåžžã«ç°¡åã«çè§£ã§ããååã§åŒã³åºãããŸãã忢ãªTheShadeãartyushovãchereminãAlexeyTokarã«æè¬ããŸã 圌ããïŒããªãã«ã€ããŠïŒåºçåã«èšäºãèªã¿ãæããªåè«ãandã«æºã¡ãå
ã®ä»£ããã«ããã³ã»ã³ã¹ã倧è¡ã«æã¡èŸŒãŸãªãããšã確ãããã