簡體   English   中英

Java垃圾收集

[英]Java Garbage Collection

我想知道Java中發生的垃圾收集。 它真的能夠處理所有未使用的對象並釋放最可能的內存嗎?

我還想知道Java垃圾收集如何與另一種語言比較,比如說C#? 然后,自動垃圾收集如何通過C語言進行手動收集?

是的,這就是垃圾收集的重點。

有許多不同形式的垃圾收集。 最簡單的形式,引用計數,不能處理某些類型的垃圾(循環引用)而不增強算法。

Java(Sun JVM)使用分代標記和掃描收集器,盡管這不是標准化的,並且不同的JVM確實使用不同的收集器。 我不知道.NET CLR使用的確切收集器。

垃圾收集器可以降低程序員的開銷,並且可以使某些算法的性能更好。 但是,它們的內存占用量通常大於緊湊的手動分配系統。

關於這個主題的事實參考是垃圾收集書 ,它寫得很好而且很全面。

它真的能夠處理所有未使用的對象

不,它不能。 但是,它可以收集所有不能再使用的物體,並且它可以很好地完成。 差異很微妙,見下文。


說明

例如,假設您有以下代碼:

class A {
    public static Date d = new Date(); // d will never be collected
}

讓我們說知道在一段時間之后d將永遠不會被再次訪問。 但是,運行時系統沒有該信息,並且d將無限期保持活動,而在C ++中,您可以明確地刪除它。

相反,垃圾收集器收集不再可訪問的所有對象。 例如:

void f() {
    Date d = new Date();
    System.out.println(d.toString());
} // d is no longer accessible at this point

垃圾收集器檢測到d引用的對象無法再次被訪問,因為d是它的唯一引用,並且它在方法結束時超出范圍。 收集不可訪問的對象是對“可以收集哪些對象”問題的低估 ,但它是安全的,因為它保證不會收集活動對象。

差異是微妙的,事實上,在大多數理智的代碼中,將收集您不再使用的所有對象。 該集合本身是完整的,能夠正確地識別和收集每個不可訪問的對象 ,並且包括由於其所有引用都駐留在其他不可訪問的對象中而無法訪問的對象。

Garabage收集器搜索對象並檢查它們是否被有效指針引用。 如果沒有,它們將被完全刪除。 這消除了潛在的問題,例如讓實時指針引用死對象,從而陷入內存中無所事事。

使用需要您自己分配,釋放和重新分配空間的語言(例如C)可能非常棘手,因為您需要完全控制為您需要的任何對象分配空間並取消分配任何對象你完成的對象,而不會忘記使用空間坐在某處的任何不需要的對象。 盡管很棘手,它確實具有性能優勢。

垃圾收集器傾向於在低級別分配空間,這可能會損害性能。 但是對於大多數應用程序來說,性能下降不會很大,因此也不會顯着。

垃圾收集器是實現定義的。 存在不同類型的GC; 使用哪一個不是程序必須擔心的。

我不能說C,但在C ++中我們實際上很少使用完整的垃圾收集器,因為C ++程序員有像RAII和引用計數智能指針這樣的技術,有助於簡化內存管理。

垃圾收集器(GC)不時運行以查找對象的引用。 首先標記沒有任何引用的那些,並調用finalize()方法。 下次從內存中刪除對象。 GC使程序有點慢。 您可以影響GC行為,但無法保證。

對於.NET,請查看垃圾收集器基礎知識和性能提示在那里您還可以找到一些性能提示。

對於Java,請查看Java理論和實踐:垃圾收集和性能 你也會發現一些提示和“反提示”,即使GC惡化的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM