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

福大大答案2020-10-06:安全

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

中級回答:
用戶線程暫停,GC 線程要開始工做,可是要確保用戶線程暫停的這行字節碼指令是不會致使引用關係的變化。因此 JVM 會在字節碼指令中,選一些指令, 做爲「安全點」,好比方法調用、循環跳轉、異常跳轉等,通常是這些指令纔會產生安全點。
爲何它叫安全點,是這樣的,GC 時要暫停業務線程,並非搶佔式中斷(立馬把業務線程中斷)而是主動式中斷。
主動式中斷是設置一個標誌,這個標誌是中斷標誌,各業務線程在運行過程當中會不停的主動去輪詢這個標誌,一旦發現中斷標誌爲 True,就會在本身最近 的「安全點」上主動中斷掛起。
爲何須要安全區域?
要是業務線程都不執行(業務線程處於 Sleep 或者是 Blocked 狀態),那麼程序就沒辦法進入安全點,對於這種狀況,就必須引入安全區域。
安全區域是指可以確保在某一段代碼片斷之中, 引用關係不會發生變化,所以,在這個區域中任意地方開始垃圾收集都是安全的。咱們也能夠把安全區城看做被擴展拉伸了的安全點。
當用戶線程執行到安全區域裏面的代碼時,首先會標識本身已經進入了安全區域,這段時間裏 JVM 要發起 GC 就沒必要去管這個線程了。 當線程要離開安全區域時,它要 JVM 是否已經完成了(根節點枚舉,或者其餘 GC 中須要暫停用戶線程的階段)
一、若是完成了,那線程就看成沒事發生過,繼續執行。
二、不然它就必須一直等待, 直到收到能夠離開安全區域的信號爲止。.net


評論線程

相關文章
相關標籤/搜索