2017-08-02 53 views
2

「年輕的GC變得效率低下,如果我們有年齡更大的持久對象」被引用爲贊成不變對象的原因之一。爲什麼不可變對象更適合分代GC?

  • 收集器在老一代遇到這樣的對象時究竟發生了什麼?

  • 爲什麼要在年輕一代中收集一個指向對象的舊對象比較麻煩?

回答

2

要收集伊甸園空間(年輕的gen),任何活的物體從伊甸園空間複製到其中一個倖存者空間。已經存在於倖存者空間中的物體會從「發」空間複製到「收」空間,除非它們的年齡足以提升到老一代(在這種情況下,它們將在那裏被複制)。

所有這些都涉及對象重定位。爲了安全地執行此操作,舊一代中指向新一代中的對象(在次要GC期間重新定位)的對象必須更新這些引用。引用重新定位的對象的對象越多,GC在次要GC期間所做的工作就越多。

如果僅使用不可變對象,將包含來自舊gen指針的對象數。到了年輕的一代。將會非常小(很可能爲零)。只有兩種方式可能發生:

  1. 一個對象被提升爲舊有的。而它所指的對象 仍處於倖存者空間。
  2. 一個對象足夠大,可以直接在舊代碼中分配。並且指的是年輕族中的一個物體。

總結答案,使用不可變對象你減少了GC有一個小的收集過程中更新對象引用的可能數目,因此提高了效率。

+0

爲什麼參考文獻需要更新?從伊甸園複製到倖存者是否涉及對象回收? – IUnknown

+0

如果對象A是指對象B並且對象B被重新定位(從伊甸園到倖存者,倖存者到舊的倖存者或倖存者),則對象A中的引用必須更新。一旦先前被對象B佔用的內存區域被重用,對象A中的引用將會完全不同。 – Speakjava

-1
  • 當集電極遇到這樣的對象在老一代究竟會發生什麼?它是怎樣處理的呢?

典型的不能,集電極認爲老一輩收集對象能促進東西它不能在年輕一代中收穫之前,所以由收藏家考慮時間,如果父對象可以收集他們是沒有更年輕的一代。我認爲他們的問題是在年輕一代遇到問題時會發生什麼,它必須跳過它,並且可能會像年輕一代GC那樣跳過它幾百或幾千次,之後纔會對老一代做一件事。

  • 爲什麼要收集一個年齡較大的對象,指的是年老一代中的一個對象呢?

正由老一代對象引用意味着它有效地凍結在年輕一代,通過年輕一代被引用的對象沒有問題,因爲它開始從老一輩收集前的年輕一代都解決了。

我認爲只要你對所有未使用的對象進行解引用,那麼它不會損害你的GC效率,但這可能是一個大型應用程序中的大量額外工作。

相關問題