对象是否可回收的方法有哪些?
gc是JAVA语言魅力之所在,也是面试过程中常常提及的点,下面分析下jvm怎么回收垃圾!
1,被动回收:首先需要明确的是,jvm有一套自动回收垃圾的机制,jvm中的线程在扫描的时候如果发现有不可达对象,就进行标记,表示这个对象占用的内存可以回收(这个时候还没回收)。
这里的重点是什么是不可达对象?jvm会选择一个不会被回收的变量(static final),或者本地方法栈中的对象,或者静态(static)的对象作为GC ROOTS(根节点),其他所有创建的对象引用都会挂在这个根节点上,变成一颗类似树的结构。
在回收垃圾的时候,从根节点开始遍历,如果发现有对象引用遍历不到,也就是没挂在根节点上,比如A引用B,B引用C,但是A挂在树上的引用被剪断,那么ABC对象就属于不可达对象,也就是需要回收的对象!
回收线程再次扫描的时候发现之前被搭上标记的对象,并调用类中默认继承的finalize方法,该方法会检测是否有引用继续指向待回收对象,如有引用,则这些对象重新使用不在回收,如果确定回收的对象,会放入一个专门回收的队列中,由专门的线程进行清空内存!
2,主动回收:调用system.gc方法进行对象回收,但是正如上面所说,调用了之后,只是打上可回收标记,真正的释放内存还需要jvm自己来进行!
JAVA是个无底洞,如果您有问题,欢迎来交流,更多的技术分享,敬请关注。。
Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有