一、问题
笔者最近遇到超级多的关于java中垃圾回收机制的问题,所以特地写一遍博客来和大家交流一下java中的垃圾回收到底是什么鬼。所谓垃圾回收即使jvm觉得你这个对象没有存在的必要,将你清理出去,那么问题来了。
如何确定某个对象是需要被回收?
典型的垃圾收集算法,是怎么回收对象的?
典型的垃圾收集器有哪些?
下面我来一个一个看问题
二、如何确定某个对象是需要被回收的
这里我们先了解一个的问题:如果确定某个对象是“垃圾”?既然垃圾收集器的任务是回收垃圾对象所占的空间供新的对象使用,那么垃圾收集器如何确定某个对象是“垃圾”?—即通过什么方法判断一个对象可以被回收了。有些对象是jvm内存不足需要清理内存空间,会将下一轮需要回收的对象进行清理。
在java中是通过引用来和对象进行关联的,也就是说如果要操作对象,必须通过引用来进行。那么很显然一个简单的办法就是通过引用计数来判断一个对象是否可以被回收。不失一般性,如果一个对象没有任何引用与之关联,则说明该对象基本不太可能在其他地方被使用到,那么这个对象就成为可被回收的对象了。这种方式成为引用计数法。
这样的方法简单粗暴,而且效率很高。效率高必然会暴露一些问题,如果某些对象呗循环引用,即使你把对象赋值为null,这种算法照样不能回收。看下下面的代码
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; } }