2010-09-20 56 views
1

這個問題是一個跟進我以前的Java GC問題:Java Garbage Collector clarificationJava的GC停止複製

這個問題也被提到了同一篇文章。

我有點困惑,爲什麼stop and copy碎片整理對象堆分配的方法是如此常用。是的,它會對堆進行碎片整理,但是看起來好像有大量的開銷,因爲基本上你將堆的總大小減半。另外你需要複製所有活着的物體,當一半的空間用完時。

除碎片整理之外,還有其他一些根本原因,爲什麼'停止和複製'比'標記和掃描'更好?

+3

你確實意識到這篇文章是從1996年開始的,從那以後世界已經發生了很多變化,對吧?看一看Sun Hotspot文檔,特別是「調整垃圾回收」,看看今天的情況(我沒有鏈接,但Google有)。 – Anon 2010-09-20 17:00:13

+0

碎片整理並不一定會將堆大小總量減半。有些實現可能會這樣做。它也不一定會複製所有活動對象。 – 2010-09-20 17:17:52

+0

好的,所以我只是google'調整垃圾收集',但我真的不明白這個機制?有人可以快速解釋嗎? – Albinoswordfish 2010-09-20 17:47:43

回答

4

實際上,碎片的根本,而一些GC擊敗它的能力是一個相當的資產。

曾經是流行的GC實現的停止和拷貝算法因爲:

  1. 它是簡單的實現;
  2. 它自動整理內存;
  3. 其運行時間與對象的數量成正比,這使得它漸近效率非常高。

更現代的GC,包括那些在Java中使用,使用更加複雜的策略,因爲他們想使短暫停(而不是讓總GC時間低,他們希望永遠不要停止很長一段時間的應用,因爲暫停對交互性不利),與緩存和虛擬內存更乾淨地交互,並受益於具有多個CPU的系統。

Jones and Lins book是誰想要了解垃圾收集的必讀。

1

垃圾收集器的一個很好的教程是Tuning Garbage Collection(不幸的是,新的oracle網站已經把它的格式化了很多)。

您的問題在第五章中處理。這基本上說明了您可以在Java垃圾回收器中使用哪些策略類型,哪些類型是默認策略。大多數桌面應用程序會對儘可能小的停止感興趣,因爲這是用戶可能注意到的。

請注意,您的問題不是關於碎片整理。兩者最終都會壓縮內存空間。