判断对象已死的方式
- 引用计数算法
- 可达性分析算法
1. 引用计数算法
对象中添加引用计数器,当有地方引用时,计数器的值就加一,引用失效,计数器之减一。
2. 可达性分析算法
通过称为“GC Roots”的根对象作为起始节点集,从节点开始根据引用关系向下搜索,搜索走过的路程称为引用链。如果某个对象到GC Roots之间没有引用链,那么这个对象就是不再被使用的,被判为可回收的对象。
引用
引用可分为强引用、弱引用、软引用、弱引用
真正宣告对象死亡
宣告对象真正死亡会面临最多两次标记。
- 可达性分析后,没有与GC Roots相连的引用链,第一次标记。 再判断对象是否需要执行finalize()方法。需要执行:对象覆盖了finalize()方法且finalize()未被虚拟机调用过。
- 若finalize()方法需要执行,对象会被放在F-Queue队列中,等待虚拟机自动创建、低调度优先级的Finalizer线程去执行finalize()方法。如果对象在finalize()方法中对自己进行拯救,与引用链上的任意对象建立关联,如把自己(this)赋值给某个类变量或者对象的成员变量。如果对象未被拯救,那么第二次标记。
方法区的垃圾回收
方法区垃圾回收主要回收两部分内容,1.废弃的常量 2.不再使用的类型
方法区的垃圾回收性价比比较低。
如何判断是不再被使用的类型
1.该类的所有实例已经被回收。
2.该类的类加载器已经被回收。
3.该类对应的java.lang.Class对象没有被引用。无法通过反射的方式访问该类。
满足以上三个条件的类仅被允许回收。
(持续更新中)