判断对象是否可以被回收的方式
要分辨一个对象是否可以被回收,有两种方式:引用计数法和可达性算法。
1. 引用计数法
就是在对象被引用时,计数加1,引用断开时,计数减1。那么一个对象的引用计数为0时,说明这个对象可以被清除。
这个算法的问题在于,如果A对象引用B的同时,B对象也引用A,即循环引用,那么虽然双方的引用计数都不为0,但如果仅仅被对方引用实际上没有存在的价值,应该被GC掉。
2. 可达性算法
通过引用计数法的缺陷可以看出,从被引用一方去判定其是否应该被清理过于片面,所以我们可以通过相反的方向去定位对象的存活价值:一个存活对象引用的所有对象都是不应该被清除的(Java中软引用或弱引用在GC时有不同判定表现,不在此深究)。这些查找起点被称为GC Root
哪些对象可以作为GC Root呢?
-
JAVA虚拟机栈中的本地变量引用对象
-
方法区中静态变量引用的对象
-
方法区中常量引用的对象
-
本地方法栈中JNI引用的对象