2020-10-06:java中垃圾回收器讓工作執行緒停頓下來是怎麼做的?

2020-10-07 13:00:36

福大大答案2020-10-06:

簡單回答:安全點,主動式中斷。

中級回答:
使用者執行緒暫停,GC 執行緒要開始工作,但是要確保使用者執行緒暫停的這行位元組碼指令是不會導致參照關係的變化。所以 JVM 會在位元組碼指令中,選一些指令, 作為「安全點」,比如方法呼叫、迴圈跳轉、異常跳轉等,一般是這些指令才會產生安全點。
為什麼它叫安全點,是這樣的,GC 時要暫停業務執行緒,並不是搶佔式中斷(立馬把業務執行緒中斷)而是主動式中斷。
主動式中斷是設定一個標誌,這個標誌是中斷標誌,各業務執行緒在執行過程中會不停的主動去輪詢這個標誌,一旦發現中斷標誌為 True,就會在自己最近 的「安全點」上主動中斷掛起。
為什麼需要安全區域?
要是業務執行緒都不執行(業務執行緒處於 Sleep 或者是 Blocked 狀態),那麼程式就沒辦法進入安全點,對於這種情況,就必須引入安全區域。
安全區域是指能夠確保在某一段程式碼片段之中, 參照關係不會發生變化,因此,在這個區域中任意地方開始垃圾收集都是安全的。我們也可以把安全區城看作被擴充套件拉伸了的安全點。
當使用者執行緒執行到安全區域裡面的程式碼時,首先會標識自己已經進入了安全區域,這段時間裡 JVM 要發起 GC 就不必去管這個執行緒了。 當執行緒要離開安全區域時,它要 JVM 是否已經完成了(根節點列舉,或者其他 GC 中需要暫停使用者執行緒的階段)
1、如果完成了,那執行緒就當作沒事發生過,繼續執行。
2、否則它就必須一直等待, 直到收到可以離開安全區域的訊號為止。


評論