jvm中判定对象需要回收的方法-mile米乐体育
引用计数法
每个对象上都有一个引用计数,对象每被引用一次,引用计数器就 1,对象引用被释放,引用计数器-1,直到对象的引用计数为0,对象就标识可以回收
这个可以用数据算法中的图形表示,对象a-对象b-对象c 都有引用,所以不会被回收,对象b由于没有被引用,没有路径可以达到对象b,对象b的引用计数就就是0,http://www.cppcns.com对象b就会被回收。
但是这个算法有明显的缺陷,对于循环引用的情况下,循环引用的对象就不会被回收。例如下图:对象a,对象b 循环引用,没有其他的对象引用a和b,则a和b 都不会被回收。
root搜索算法
这种算法目前定义了几个root,也就是这几个对象是jvm虚拟机不会被回收的对象,所以这些对象引用的对象都是在使用中的对象,这些对象未使用的对象就是即将要被回收的对象。简单就是说:如果对象能够达到root,就不会被回收,如果对象不能够达到root,就会被回收。
被启动类(bootstrap加载器)加载的类和创建的对象
jvm运行时方法区类静态变量(static)引用的对象
jvm运行时方法去常量池引用的对象
jvm当前运行线程中的虚拟机栈变量表引用的对象
本地方法栈中(jni)引用的对象
jvm在确定是否回收的对象的时候采用的是root搜索算法来实现。
ueue队列的对象进行二次标记,若对象在finalize() 方法中未能逃脱,那么该对象会被二次标记,二次标记的对象判定为需要回收;
(对象可以在 finalize()方法中,将自己和引用链上的对象建立引用关系,这样在第二次标记时,收集器会将其移出回收对象的集合,以此达到逃脱)
到此这篇关于jvm中如何判定对象需要回收的文章就介绍到这了,更多相关jvm判断对象恰卡编程网回收内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!