2012-06-13 40 views
1

垃圾回收標識任何變量不再引用的對象,然後回收對象佔用的內存。在java中定期完成垃圾收集過程嗎?

我不是否這個過程中有規律的時間間隔只要一個對象的引用計數下降到零或完成。

假設,如果GC在對象引用計數下降到零時立即工作,那麼不需要通過調用System.GC()來請求GC;那麼,在這種情況下該方法的目的是什麼?

+5

我認爲這裏有一個類似的問題:http://stackoverflow.com/questions/3824215/when-is-garbage-collector-used-in-java –

+1

在正常情況下,應該永遠不需要明確請求垃圾通過調用'System.gc()'集合。 – Axel

回答

1

當你撥打System.gc()時,你要求垃圾收集器進行清理。問題是,GC何時會響應您的請求並不清楚。更甚者,GC可能在您調用它時根本不運行。 在java中,您無法預測GC將如何工作。 (這就是爲什麼被認爲是不好的做法,把你清理代碼Objectfinalize()法)。在Java中,將自動收集超出引用對象的垃圾。這就是爲什麼你不需要撥打System.gc()。在特殊情況下,當你想,如果可能的運行它,你可以嘗試使用這種方法,但不能保證行爲。 (如上所述)。

4

GC既不以規則的間隔進行,也只要一個對象的引用計數下降到零(注意:大多數的JVM實現不使用引用計數算法,所以這最後一點是沒有實際意義)。

當GC將運行由垃圾收集算法決定。

0

一個物體變得符合垃圾收集或GC如果它不是來自任何活動線程或者換句話說,任何靜態refrences可達你可以說,如果所有的引用都是空的對象符合垃圾收集。循環依賴不被視爲引用,所以如果對象A引用了對象B,並且對象B引用了對象A,並且它們沒有任何其他活動引用,則對象A和B都有資格進行垃圾收集。 通常一個物體變得有資格在Java垃圾收集在以下情況:
1)顯式設置爲NULL對象的所有引用如object = null
2)對象是在塊內創建的,一旦控件退出該塊,引用就會超出範圍。
3)父對象被設置爲空,如果一個對象持有另一個對象的引用,並且當你設置容器對象的引用null,子對象或包含對象自動變爲符合垃圾回收的條件。
4)如果一個對象只有通過WeakHashMap的實時引用,它將有資格進行垃圾回收。

有像System.gc()和Runtime.gc()這樣的方法用於向Garbage Collection發送垃圾收集請求,但不能保證會發生垃圾收集。

1

這是由垃圾收集算法決定的。甚至有如System.gc()Runtime.gc()這樣的方法,用於向JVM 發送Garbage collection的請求,但不保證垃圾收集會發生。

0

有兩個答案:

  1. 它不是由JVM規範,在JLS或任何其他權威的Java文件的規定在垃圾收集器將運行。因此它是具體實現。

  2. 在實踐中,通常使用幾個不同的策略。對於非併發收集器,當嘗試分配失敗時觸發GC,因爲沒有足夠的未分配空間。對於併發收集器,當可用空間量下降到預定閾值以下時開始收集。 (對於熱點併發GC的,閾值比率是一個可調參數。)

沒有現代的Java GC使用引用計數。

System.gc()的目的是允許應用程序給JVM一個提示「現在是運行垃圾回收器的好時機」。 JVM被允許忽略該提示。作爲一般規則,以這種方式觸發GC在CPU使用率方面效率低下。在生產代碼中執行此操作的唯一正當理由是爲了避免高度交互式應用程序中的GC暫停。 (當你知道不需要交互時,你試圖強制一個GC;例如在遊戲中的「關卡」之間)。

1

大多數現代JVM使用「停止這世界」垃圾收集器,那就是停止所有應用程序線程的程序,執行垃圾收集,然後繼續應用程序的線程垃圾收集器。這意味着,在做垃圾回收之前,在應用程序中的所有線程應該達到一個點,是安全的停止線程。