[英]What is a compaction in Java GC?
我閱讀了http://www.cubrid.org/blog/tags/Garbage%20Collection/文章,它提供了Java中GC的高級圖片。 它說:
壓縮任務是通過壓縮內存來刪除內存碎片,以便刪除分配的內存區域之間的空白區域 。
物體是否應移動到其他位置以填充孔?
我認為對象被移動了。 如果是這樣,平均地址會發生變化,那么對該對象的引用也應該更新?
找到所有后退參考並更新它們似乎太復雜了...
是的,任意對象通過內存任意移動,是的,這需要更新對這些對象的引用。 也可以使用間接,但這有各種缺點 ,我不知道任何高性能GC做它。
這確實有點復雜,但就GC優化來說,它是相當溫和的。 基本的mark-compact運行得相當好,它基本上只是按地址順序遍歷所有對象,將它們移動到最小的可用地址,並構建一個“中斷表”,其中包含必要的信息(起始地址 - >位移)快速修復引用,然后在第二遍中執行。 除了任何標記掃描收集器已經需要的信息或簿記(對象類型,引用位置等)之外,這些都不需要信息或簿記。
當您在世代環境中將對象移出托兒所時,您也(大致)知道舊引用的位置。 你需要知道做一個小的收藏。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.