JVM如何判断一个对象是不是要被回收
2019-01-19 18:51
211 查看
1,引用计数法
每个对象创建的时候会分配一个引用计数器,当这个对象被引用的时候计数器的值就会+1。任何时候,当引用计数器值为0的时候就说明这个对象不被使用了,需要被GC回收掉。
优点:算法简单。
缺点:不能解决循环引用的问题,有垃圾对象不能被正确识别。
2,根搜索法
一,以特定的对象作为基础原始对象(也被称为根),通过递归的方式不断向下搜索,从跟对象到达某个对象的路径被称为引用链。如果一个对象和跟对象之间存在引用链,那么这个对象则是存活状态,不能被回收。反之,如果一个对象与根对象之间不存在引用链,那么这个对象是不可达的,那这个对象就是可回收的垃圾对象。此种算法是GC目前使用的搜索算法。
优点:可找到所有垃圾对象,并解决了循环引用的情况。
缺点:需要遍历所有对象,而且递归算法难免会导致效率不高。
二,那么都有那些对象可以被称为特定对象呢?
I,JAVA虚拟机栈中的引用对象。
II,方法区中的类静态属性引用的对象。
III,方法区中的常量引用的对象。
IV,本地方法栈中JNI引用的对象。
三,根算法中不可达对象在回收之前,要进行二次标记,第一次标记的时候会进行筛选,筛选是否有必要执行finalize()方法。有以下两种情况不需要执行finalize方法:
I,当前对象类中没有覆盖finalize方法。
II,finalize在前一次GC时已经调用过一次finalize方法了。
如果这个对象有必要执行,则会放在一个队列中,以一个低优先级的线程执行finalize方法进行二次标记,如果在finalize中,对象与根能够建立引用链,那么该对象不会被回收。
、
相关文章推荐
- JVM如何判断一个Java对象是否可以回收
- JVM如何判断一个Java对象是否可以回收
- 如何判断一个对象是不是为空
- js如何判断一个对象是不是Array
- js如何判断一个对象是不是Array?
- js如何判断一个对象是不是Array?
- JVM如何判断对象是否需要被回收
- GC是如何判断一个对象为"垃圾"的?被GC判断为"垃圾"的对象一定会被回收吗?
- JVM (PART V)如何判断对象是否应该回收
- js如何判断一个对象是不是Array?
- 虚拟机是如何判断一个对象是否需要回收
- jvm垃圾回收机制(二)算法和如何进行判断对象是否回收实例
- JVM是如何判断一个对象的存活?
- js如何判断一个对象是不是Array?
- javascript如何判断一个对象是不是Array
- JVM如何判断哪些对象可以被回收
- jvm如何判断实例对象是否需要回收
- jvm垃圾回收(GC)机制之如何判断对象已死
- JS如何判断一个对象是不是Array
- js如何判断一个对象是不是Array?