jvm-垃圾回收随时都可以STW吗?带你认识安全点和安全区域
目錄
安全點
如何在GC發生時,檢查所有線程都跑到最近的安全點停頓下來呢?
安全區域(Safe?Region)
實際執行時
安全點
1.程序執行時并非在所有地方都能停頓下來開始GC,只有在特定的位置才能停頓下來開始GC,這些位置稱為“安全點(Safepoint)”。
2.Safe?Point的選擇很重要,如果太少可能導致GC等待的時間太長,如果太頻繁可能導致運行時的性能問題。大部分指令的執行時間都非常短暫,通常會根據“是否具有讓程序長時間執行的特征”為標準。比如:選擇一些執行時間較長的指令作為Safe?Point,如方法調用、循環跳轉和異常跳轉等。
如何在GC發生時,檢查所有線程都跑到最近的安全點停頓下來呢?
1.搶先式中斷:(目前沒有虛擬機采用了)
? ? 首先中斷所有線程。如果還有線程不在安全點,就恢復線程,讓線程跑到安全點。
2.主動式中斷:
? ? 設置一個中斷標志,各個線程運行到Safe?Point的時候主動輪訓這個標志,如果中斷標志位真,則將自己進行中斷掛起。
安全區域(Safe?Region)
1.SafePoint機制保證了程序執行時,在不太長的時間內就會遇到可進入GC的SafePoint。但是,程序“不執行”的時候呢?例如線程處于Sleep狀態或Blocked狀態,這時候線程無法響應JVM的中斷請求,“走”到安全點去中斷掛起,JVM也不太可能等待線程被喚醒。對于這種情況,就需要安全區域(Safe?Region)來解決。
2.安全區域是指在一段代碼片段中,對象的引用關系不會發生變化,在這個區域中的任何位置開始GC都是安全的。我們也可以把Safe?Region看作是被擴展了的SafePoint。
實際執行時
1.當線程運行到Safe?Region的代碼時,首先標識已經進入了Safe?Region,如果這段時間內發生GC,JVM會忽略標識為Safe?Region狀態的線程;
2.當線程即將離開Safe?Region時,會檢查JVM是否已經完成GC,如果完成了,則繼續運行,否則線程必須等待直到收到可以安全離開Safe?Region的信號為止。
總結
以上是生活随笔為你收集整理的jvm-垃圾回收随时都可以STW吗?带你认识安全点和安全区域的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 认识java-STW:Stop the
- 下一篇: java强引用、软引用、弱引用、虚引用-