一、問題
筆者最近遇到超級多的關于java中垃圾回收機制的問題,所以特地寫一遍博客來和大家交流一下java中的垃圾回收到底是什么鬼。所謂垃圾回收即使jvm覺得你這個對象沒有存在的必要,將你清理出去,那么問題來了。
如何確定某個對象是需要被回收?
典型的垃圾收集算法,是怎么回收對象的?
典型的垃圾收集器有哪些?
下面我來一個一個看問題
二、如何確定某個對象是需要被回收的
這里我們先了解一個的問題:如果確定某個對象是“垃圾”?既然垃圾收集器的任務是回收垃圾對象所占的空間供新的對象使用,那么垃圾收集器如何確定某個對象是“垃圾”?—即通過什么方法判斷一個對象可以被回收了。有些對象是jvm內存不足需要清理內存空間,會將下一輪需要回收的對象進行清理。
在java中是通過引用來和對象進行關聯(lián)的,也就是說如果要操作對象,必須通過引用來進行。那么很顯然一個簡單的辦法就是通過引用計數(shù)來判斷一個對象是否可以被回收。不失一般性,如果一個對象沒有任何引用與之關聯(lián),則說明該對象基本不太可能在其他地方被使用到,那么這個對象就成為可被回收的對象了。這種方式成為引用計數(shù)法。
這樣的方法簡單粗暴,而且效率很高。效率高必然會暴露一些問題,如果某些對象唄循環(huán)引用,即使你把對象賦值為null,這種算法照樣不能回收??聪孪旅娴拇a
public class GcTest { public Object object = null; public static void main(String[] args) { GcTest gcTest1 = new GcTest(); GcTest gcTest2 = new GcTest(); gcTest1.object = gcTest1; gcTest2.object = gcTest2; gcTest1 = null; gcTest2 = null; } }
延伸閱讀
學習是年輕人改變自己的最好方式