2010-02-04 84 views
1

我們知道垃圾回收器是Java中的Thread。並且每個線程都將執行其邏輯。所以我想知道這個垃圾收集器使用哪個邏輯來維護內存。java中垃圾回收器的邏輯

謝謝

+6

說垃圾收集器「是主題」是非常誤導的(更不用說語法不正確)。它可以使用線程 - 可能是多個線程 - 或者它可以在甚至不支持線程的硬件上運行。我認爲你的意思更多的是它是一個獨立的過程,你的代碼不直接與之交互,這是絕對正確的。 – 2010-02-04 19:02:04

+0

這是一個非常棒的文檔,閱讀這個主題:http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html(有幾種策略可以使用) – tovare 2010-02-04 18:51:32

回答

0

此線程經常醒來並回收未使用的內存。你可以看看Mark-and-Sweep算法。它也是一個守護線程。

編輯:垃圾收集器發現並刪除主線程無法訪問的對象。

+3

您應該注意到JVM現在還沒有長時間使用MS收集器。 – 2010-02-04 18:51:56

1

當運行程序中的任何指針無法再達到該對象時,該對象被視爲垃圾。最直接的垃圾收集算法只是遍歷每個可到達的對象。任何遺留的物體都被認爲是垃圾。這種方法需要的時間與活動對象的數量成正比,這對於大量應用程序保持大量活動數據而言是禁止的。

Tuning Garbage Collection with the 5.0 Java[tm] Virtual Machine

0

兩者在COM基於體系結構的存儲器管理是引用計數。但在.NET的情況下,它完全不同。它是參考跟蹤。

引用計數: 每當在堆中創建對象時,引用計數會增加,並且在刪除引用計數時,對象的引用計數會減少。開發者的責任是確保分配資源的正確釋放。

參考跟蹤: 在.NET中,自動內存管理通過引用跟蹤進行,垃圾收集器負責處理此操作。

讓我們在堆對象分配先來看看:

堆的存儲分類如下:1. 自由空間 2.保留空間

當一個對象在堆中分配得到,下面規則必須遵循。

  1. 內存分配發生在自由空間的連續範圍內。
  2. 對於良好的局部性,內存中對象的順序仍然是它們的創建順序。
  3. 堆中的對象之間永遠不會有任何間隙。
  4. 最舊的對象位於最低地址。

GC算法: 一旦對象超出範圍,就不會發生引用跟蹤。 GC開始工作時]當堆中的內存已滿時。

GC檢查每個對象是否「可到達」。 爲了確定覆蓋能力,GC從所有根對象(基本上都是靜態的(在VB.NET中共享)成員和所有範圍內的局部變量)開始,並遍歷完整的對象參考圖。 GC在其途中遇到的每個對象都被標記爲活動。在堆

的對象將是任何兩種狀態: LIVE DEAD

在第二遍中,所有的非標記的對象被破壞,它們的資源被釋放,最後堆被再次壓縮以防止內存碎片。

+1

這是他正在談論的Java。 – 2010-02-05 06:55:28

0

JVM自動重新收集不再使用的內存。不再被引用的對象的內存將被垃圾收集器自動釋放。

要看到垃圾收集器開始工作,請將命令行參數「-verbose:gc」添加到您的虛擬機。

的深入一篇關於垃圾收集器可以在這裏找到:Tuning Garbage Collection with the 5.0 Java Virtual Machine