Intro JVM Safe Point

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