簡體   English   中英

什么是Java GC中的壓縮?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM