天天看点

垃圾回收-判断对象是否可以回收

引用技术算法

在对象中添加一个引用计数器,每有一个地方引用他的时候,计数器就会加1;当引用失效的时候,计数器的值就会减1,任何时刻的计数器为零的对象就是不可能再被使用。

缺点:当引用变量互相引用这对方,他们的引用计数都不为零,但实际上相应的两个对象不再被使用和访问,但是引用技术算法无法对他们进行回收。

可达性分析算法

通过一系列称为GC Roots的根对象作为起始节点集,从这些节点开始根据已引用关系向下搜索,搜索过程所走过的路径称为引用链。如果某个对象的GC Roots间没有任何引用链相连,证明此对象是不可能再被使用的。

GC Roots

1.虚拟机栈中引用的对象

2.在方法区中类静态属性引用的对象

3.在方法区中常量引用的对象

4.在本地方法栈中引用的对象

5.基本数据类型对应的class对象,系统类加载器等等

6.被同步锁持有的对象

四种引用

1.强引用:new出来的对象都是强引用,当对象没有被引用的时候可能会被回收(被软引用关联)。

2.软引用:还有用,但非必须的对象。在系统将要发生内存溢出的时候,被关联的对象才会被回收。

3.弱引用:发生垃圾回收的时候,不管内存够不够,都会将弱引用关联的对象进行回收。

4.虚引用:为了能在被关联的对象回收的时候收到一个系统的通知。

终结引用:触发对象的finalize方法。