0%
Intro JVM Safe Point
這篇介紹JVM Safe Point。
About JVM Safe Point
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| JVM HotSpot的實現中,使用一組稱為OopMap的data structure來存放reference object, 從而可以快速且準確的完成GC Root掃描。但Process執行的過程中,引用關係隨時都可能發生變化, 而HotSpot虛擬機只會在特殊的指令位置才會生成OopMap來記錄引用關係, 這些位置便被稱為Safepoint。換句話說,就是在Safepoint這個點上,JVM對於使用什麼引用是十分清楚的, 這個時候是可以很快完成GC Roots的掃描和可行性分析的。HotSpot會在所有方法返回之前, 以及所有Uncounted loop的循環回跳之前放置Safepoint。當需要GC時候,JVM會首先設置一個標誌, 然後等待所有thread進入Safepoint,但是不同thread進入Safepoint的時間點不一樣, 先進入Safepoint的thread需要等待其它thread全部進入Safepoint,所以Safepoint是會導致Stop-the-world。
JVM加參數來觀察log -XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1
在catalina.out下可觀察到以下log vmop [threads: total initially_running wait_to_block] [time: spin block sync cleanup vmop] page_trap_count 1346.591: no vm operation [ 911 0 0 ] [ 0 0 0 2 0 ] 0 vmop [threads: total initially_running wait_to_block] [time: spin block sync cleanup vmop] page_trap_count 1347.594: no vm operation [ 911 0 0 ] [ 0 0 0 2 0 ] 0
|