2013-07-05 102 views
1

我知道所有垃圾收集。但是究竟是什麼告訴JRE現在是垃圾收集的時候了?這是否像一些事件或時間間隔?什麼觸發垃圾收集

+1

肯定有人問過這個...是的。 – Ben

回答

0

您可以使用System.gc();,但不能保證它可以運行(它只是「建議」GC運行)。這個JVM有不同的實現,包括可以在不同模式下運行的GC,並且有非常複雜的算法,這些算法通常工作得很好,也就是說,如果你有特殊用法(或者特殊事件,比如重啓後) - 您可以調整它using flags(如:最小堆大小,最大堆大小等),但即使沒有這樣做,GC也會收集具有空引用的對象(指向它們的指針),只要需要從堆中釋放內存。

+0

你真的不應該使用System.gc。 JVM比你更清楚什麼時候做GC。有些角落案例可以調用System.gc,但大多數時候開發人員不應該這樣做。 – pushy

+0

@pushy完全同意你的看法! – alfasin

0

對象有空引用,那麼它將垃圾收集。但是GC沒有給出保證,比如什麼時候完成。作爲一個很好的做法不完全依賴於GC

5

HotSpot的垃圾收集已經成長爲一個非常複雜的業務,甚至它的創造者的鬥爭中充分詳細地瞭解。因此你不能得到一個簡單的答案;一些觸發器是:

  1. 佔用每個對象的世代達到閾值;
  2. 內存分配請求特定代失敗;
  3. 整體堆佔用達到閾值。

注意,你甚至還沒有指定什麼垃圾收集你感興趣的是:有一個輕微收集和主要集合,技術上他們是非常不同的。您還沒有指定您想要的垃圾收集器:HotSpot有四個可供選擇的垃圾收集器。

如果你是初學Java的人,最好的建議是a)在日常編程中,不要擔心;和b)如果你想學習,你將不得不去dig deep

0

JVM控制垃圾收集器,它決定何時運行垃圾收集器。當它意識到內存爲時,它會運行GC或者當沒有活動線程可以訪問它時,對象變爲符合GC的條件。

但是JVM的這種行爲不能得到保證,人們可以從java程序中請求GC發生,但不能保證這個請求會被JVM照顧。

+1

第一部分是正確的,當內存不足時Java將執行GC。但是Java並不知道對象何時符合GC的要求(這一決定是在GC中進行的)。如果使用標記/掃描收集器,它當然會標記死對象並在必要時運行掃描,但這是GC的一部分。 – pushy

+0

@pushy:你是對的,我誤解了*當一個對象符合GC和JVM *運行時* GC,謝謝你的註釋。 – Azad