github上的地址:DevelopBlog
与C语言不同,Java内存(堆内存)的回收由JVM垃圾收集器自动完成,不需要程序开发者手动释放内存。
从Java内存模型(链接)一文中,我们知道,java中几乎所有的对象实例存储在堆内存中,故而堆内存是JVM垃圾回收的主要阵地。
哪些对象需要被回收?
在讨论GC之前我们需要考虑一个问题?如何确定一个对象是否需要被回收?
两个方法:引用计数法和可达性分析法。
引用计数法
给对象添加一个引用计数器,每当有一个地方引用它时,计数器+1,当引用失效时,计数器-1;当计数器为0,则表明它没有被引用,也就是说可以被GC回收。
优点:此方法简单粗暴,效率很高。很多其他语言也是用这一方法进行对象的回收判断。
缺点:此方法无法解决对象之间的相互循环引用问题。例如:
当前内容已被隐藏,您需要登录才能查看快速登录快速注册
image.pngstep1:实例A的引用计数加1,实例A的引用计数=1;
step2:实例B的引用计数加1,实例B的引用计数=1;
step3:实例A的引用计数加1,实例A的引用计数=2;
step4:实例B的引用计数加1,实例B的引用计数=2;
执行
当前内容已被隐藏,您需要登录才能查看快速登录快速注册
之后:实例A的引用计数减1,实例A的引用计数=1;
实例B的引用计数减1,实例B的引用计数=1;
此时,objA与objB相互引用,他们的引用计数器都不是0,除此之外,再无任何其他实际