福大大答案2020-10-06:
簡單回答:安全點,主動式中斷,
中級回答:
用戶執行緒暫停,GC 執行緒要開始作業,但是要確保用戶執行緒暫停的這行位元組碼指令是不會導致參考關系的變化,所以 JVM 會在位元組碼指令中,選一些指令, 作為“安全點”,比如方法呼叫、回圈跳轉、例外跳轉等,一般是這些指令才會產生安全點,
為什么它叫安全點,是這樣的,GC 時要暫停業務執行緒,并不是搶占式中斷(立馬把業務執行緒中斷)而是主動式中斷,
主動式中斷是設定一個標志,這個標志是中斷標志,各業務執行緒在運行程序中會不停的主動去輪詢這個標志,一旦發現中斷標志為 True,就會在自己最近 的“安全點”上主動中斷掛起,
為什么需要安全區域?
要是業務執行緒都不執行(業務執行緒處于 Sleep 或者是 Blocked 狀態),那么程式就沒辦法進入安全點,對于這種情況,就必須引入安全區域,
安全區域是指能夠確保在某一段代碼片段之中, 參考關系不會發生變化,因此,在這個區域中任意地方開始垃圾收集都是安全的,我們也可以把安全區城看作被擴展拉伸了的安全點,
當用戶執行緒執行到安全區域里面的代碼時,首先會標識自己已經進入了安全區域,這段時間里 JVM 要發起 GC 就不必去管這個執行緒了, 當執行緒要離開安全區域時,它要 JVM 是否已經完成了(根節點列舉,或者其他 GC 中需要暫停用戶執行緒的階段)
1、如果完成了,那執行緒就當作沒事發生過,繼續執行,
2、否則它就必須一直等待, 直到收到可以離開安全區域的信號為止,
評論
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/161904.html
標籤:其他
上一篇:c++ 實作遠程CMD
