2010-09-29 28 views
1

據我所知只有當JVM需要更多的內存時才使用GC,但我不確定它。所以,請有人提出這個問題的答案。什麼時候在java中使用垃圾回收器?

+6

有許多好文章網上關於GC。嘗試搜索一些太陽博客或白皮書。這些對你最有幫助。 – 2010-09-29 17:30:00

回答

8

據我所知,Java的垃圾回收算法非常複雜,並不那麼簡單。此外,還有更多可用於GC的算法,可以在VM啓動時使用傳遞給JVM的參數進行選擇。

有一個關於垃圾收集在這裏FAQ:http://www.oracle.com/technetwork/java/faq-140837.html

甲骨文還發表了一篇文章「調整垃圾回收與5.0的Java(TM)虛擬機」,其中包含的深刻見解變成垃圾收集,並可能幫助你理解這件事更好:http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

+0

常見問題鏈接是否有用。 – 2010-09-29 21:55:05

2

JVM和Java規範沒有說垃圾收集何時發生,所以它完全取決於JVM實現者他們希望使用哪些策略。每個JVM都應該有一些關於它如何處理GC的文檔。

通常情況下,當內存分配將分配的內存總量推到某個閾值以上時,大多數JVM都會觸發GC。可能有多個級別的gc(全部與部分/世代)出現在不同的閾值。

0

在過去,垃圾收集器本質上是經驗性的。在某個設定的時間間隔或基於某種條件,他們會踢入並檢查每個對象。

現代的收藏家更聰明是因爲他們根據物體具有不同的壽命這一事實進行區分。這些對象區分年輕一代對象和終身代代對象。

內存按照代次在池中進行管理。每當年輕一代記憶池被填滿時,就會發生次要收集。倖存的對象被移動到終身代內存池。當終身代內存池被填滿時,發生主要收集。保留第三代,稱爲永久代,可能包含定義類和方法的對象。

1

垃圾收集是在Java語言規範中故意模糊地描述的,爲JVM實現者提供了最佳工作條件來提供好的垃圾收集器。

因此,垃圾收集器及其行爲是非常依賴供應商。

最簡單但最不有趣的是當需要清潔時停止整個程序。其他人則更加複雜,並且在您的程序清理過程中安靜地運行,因爲您或多或少地積極參與。

調查垃圾回收的最有趣的方法是在Sun 6 JDK中運行jvisualvm。它允許你看到許多與垃圾收集相關的許多內部事物。

https://visualvm.dev.java.net/monitor_tab.html(但最新的版本有很多更多)