算法
引用计数算法
算法思路:当引用一个对象时,设置引用计数器+1。当不再引用一个对象时,引用计数器-1。最后判断计数器是否为0。如果是0说明未被引用。否则说明该对象被引用。
存在问题:对象的循环引用得不到处理。
可达性分析算法
jvm使用的分析算法。
算法思路:设置对象回收的根节点(GC Roots),从根节点向下搜索,搜索到说明对象在使用。如果对象没有达跟节点的使用链,判定为可回收对象。
java中 可作为GC Roots的对象包括
- 虚拟机栈中引用的对象。
- 方法区中的静态属性引用的对象。
- 方法区中常量引用的对象。
- 本地方法栈中JNI(即一般说的Native方法)引用的对象。
对象引用类型
是否死亡?
在对象找不到GC Roots的情况下,对象也不是必定死亡可以回收空间。它们其实只是被判刑,却还有一次挽回的机会。
对没有GC Roots的对象,进一步判断是否有必要进行finalize()方法的筛选。如果一个对象判断为没有覆盖finalize()方法或者finalize()已经被执行过,那么这个对象基本上确定需要被gc了。如果这个对象有需要进行finalize()的方法,可在finalize()方法内进行对GC Roots节点的链接,实现了自我救赎,否则该对象基本上就需要gc了。
finalize()方法只会执行一次。