回答
此線程經常醒來並回收未使用的內存。你可以看看Mark-and-Sweep算法。它也是一個守護線程。
編輯:垃圾收集器發現並刪除主線程無法訪問的對象。
您應該注意到JVM現在還沒有長時間使用MS收集器。 – 2010-02-04 18:51:56
當運行程序中的任何指針無法再達到該對象時,該對象被視爲垃圾。最直接的垃圾收集算法只是遍歷每個可到達的對象。任何遺留的物體都被認爲是垃圾。這種方法需要的時間與活動對象的數量成正比,這對於大量應用程序保持大量活動數據而言是禁止的。
從Tuning Garbage Collection with the 5.0 Java[tm] Virtual Machine
兩者在COM基於體系結構的存儲器管理是引用計數。但在.NET的情況下,它完全不同。它是參考跟蹤。
引用計數: 每當在堆中創建對象時,引用計數會增加,並且在刪除引用計數時,對象的引用計數會減少。開發者的責任是確保分配資源的正確釋放。
參考跟蹤: 在.NET中,自動內存管理通過引用跟蹤進行,垃圾收集器負責處理此操作。
讓我們在堆對象分配先來看看:
堆的存儲分類如下:1. 自由空間 2.保留空間
當一個對象在堆中分配得到,下面規則必須遵循。
- 內存分配發生在自由空間的連續範圍內。
- 對於良好的局部性,內存中對象的順序仍然是它們的創建順序。
- 堆中的對象之間永遠不會有任何間隙。
- 最舊的對象位於最低地址。
GC算法: 一旦對象超出範圍,就不會發生引用跟蹤。 GC開始工作時]當堆中的內存已滿時。
GC檢查每個對象是否「可到達」。 爲了確定覆蓋能力,GC從所有根對象(基本上都是靜態的(在VB.NET中共享)成員和所有範圍內的局部變量)開始,並遍歷完整的對象參考圖。 GC在其途中遇到的每個對象都被標記爲活動。在堆
的對象將是任何兩種狀態: LIVE DEAD
在第二遍中,所有的非標記的對象被破壞,它們的資源被釋放,最後堆被再次壓縮以防止內存碎片。
這是他正在談論的Java。 – 2010-02-05 06:55:28
JVM自動重新收集不再使用的內存。不再被引用的對象的內存將被垃圾收集器自動釋放。
要看到垃圾收集器開始工作,請將命令行參數「-verbose:gc」添加到您的虛擬機。
的深入一篇關於垃圾收集器可以在這裏找到:Tuning Garbage Collection with the 5.0 Java Virtual Machine
- 1. Java垃圾回收器
- 2. Java:垃圾回收
- 3. Java:垃圾回收
- 4. java垃圾回收
- 5. java - 垃圾回收
- 6. Java EE:servlet容器中的垃圾回收
- 7. Java垃圾回收5
- 8. 垃圾回收Java類
- 9. Java列表和垃圾回收器
- 10. Java中String類的垃圾回收
- 11. 噓,垃圾回收器
- 12. Perl中的垃圾回收
- 13. JAVA中的垃圾收集器sp
- 14. Android 2.3中的垃圾回收器
- 15. Kubernetes中的容器垃圾回收
- 16. 因垃圾對象引用而導致的java垃圾回收
- 17. 垃圾收集java
- 18. Java垃圾收集
- 19. Java垃圾收集
- 20. JDBC垃圾回收
- 21. C#垃圾回收
- 22. Erlang垃圾回收
- 23. Python垃圾回收
- 24. JS垃圾回收
- 25. Javascript垃圾回收
- 26. PhoneGap垃圾回收
- 27. Java - 可用的垃圾回收算法
- 28. 在RAD中運行垃圾回收器
- 29. 當Java的垃圾收集器回收內存?
- 30. 垃圾收集器
說垃圾收集器「是主題」是非常誤導的(更不用說語法不正確)。它可以使用線程 - 可能是多個線程 - 或者它可以在甚至不支持線程的硬件上運行。我認爲你的意思更多的是它是一個獨立的過程,你的代碼不直接與之交互,這是絕對正確的。 – 2010-02-04 19:02:04
這是一個非常棒的文檔,閱讀這個主題:http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html(有幾種策略可以使用) – tovare 2010-02-04 18:51:32