JVM垃圾回收安全點Safe Point


GC安全點(Safepoint)

  • 程序執行時並非在所有地方都能停頓下來開始GC,只有在特定的位置才能停頓下來開始GC,這些位置稱為“安全點(Safepoint) ”
  • Safe Point的選擇很重要,如果太少可能導致GC等待的時間太長,如果太頻繁可能導致運行時的性能問題。大部分指令的執行時間都非常短暫,通常會根據“是否具有讓程序長時間執行的特征”為標准。比如:選擇些執行時間較長的指令作為Safe Point, 如方法調用、循環跳轉和異常跳轉等。

如何在GC發生時,檢查所有線程都跑到最近的安全點停頓下來呢?

  • 搶先式中斷: (目前沒有虛擬機采用了) 首先中斷所有線程。如果還有線程不在安全點,就恢復線程,讓線程跑到安全點。
  • 主動式中斷: 設置一個中斷標志,各個線程運行到Safe Point的時候主動輪詢這個標志,如果中斷標志為真,則將自己進行中斷掛起。

安全區域(Safe Region)

Safepoint機制保證了程序執行時,在不太長的時間內就會遇到可進入GC的Safepoint

但是,程序“不執行”的時候呢?例如線程處於Sleep 狀態或Blocked狀態,這時候線程無法響應JVM的中斷請求,“走” 到安全點去中斷掛起,JVM也不太可能等待線程被喚醒。對於這種情況,就需要安全區域(Safe Region)來解決。

安全區域是指在一段代碼片段中,對象的引用關系不會發生變化,在這個區域中的任何位置開始GC都是安全的。我們也可以把Safe Region 看做是被擴展了的Safepoint。

程序實際執行時:

  • 1、當用戶線程運行到Safe Region的代碼時,首先標識已經進入了Safe Region,如果這段時間內發生GC,JVM會忽略標識為Safe Region狀態的用戶線程即用戶線程STW,等待JVM執行GC完畢;
  • 2、當用戶線程即將離開Safe Region時, 會檢查JVM是否已經完成GC,如果完成了,則用戶線程繼續運行,否則用戶線程必須等待直到收到可以安全離開SafeRegion的信號為止;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM