我相信這是一個簡單的問題,但我對我的理解有一點疑問。我擔心的是,每當 GC 啟動垃圾收集時,它主要涉及三個步驟:標記掃壓實GC標記階段時,從GC根開始遍歷所有對象,對不可達對象進行標記。我已經讀過很多塊了。我的疑問是,當從 GC 根遍歷時,GC 只會訪問活動對象(在樹中被引用)。正確的!那么肯定沒有辦法到達不可到達的對象。那么 GC 如何標記不可到達的對象,因為 GC 無法到達它們。請幫助我理解這個概念。謝謝!
3 回答

偶然的你
TA貢獻1841條經驗 獲得超3個贊
GC 如何將不可到達的對象標記為已經不可到達
不可達的對象不會被標記。
這個想法是,標記過程訪問所有可到達的對象,并在它找到的每個對象上設置標記。然后掃描階段會清除未標記的對象。
那么GC是如何找到那些沒有被標記的對象的呢?
好吧,所有對象都有一個標頭塊,其中包括標記位和其他內容以及對象的大小。對象在內存中連續存儲。因此,如果您擁有第一個對象的地址,則只需將對象大小和標頭大小添加到該地址......并且您就擁有了下一個對象的地址。
這就是掃地機的作用。它掃描所有對象,檢查它們是否被標記。然后刪除未標記的對象。
(我簡化了很多......)

慕標5832272
TA貢獻1966條經驗 獲得超4個贊
雖然標記階段是從根開始的圖形遍歷,但掃描階段收集器可以對內存區域執行(可并行的)線性掃描,根據已知布局(大多數 JVM 實現中的標頭、某些其他實現中的 GC 槽的固定大?。┳R別所有對象。運行時間)
添加回答
舉報
0/150
提交
取消