判断对象是否存活
程序计数器, 虚拟机栈, 本地方法栈属于线程私有, 只存在于线程的生存周期内, 线程结束也就跟着消失了, 因此不需要对上述空间进行垃圾回收. 只需要考虑方法区和堆.
那么我们判断一个对象是否存活就有下列两种方法:
- 引用计数法 通过给对象添加一个引用计数器, 判断被引用次数是否为0来确定是否存活. 但是弊端在于循环引用导致环状死亡对象不能被回收.
- 可达性分析算法
通过GC Roots作为起始点来进行搜索, 能够到达的对象都是存活的, 不可达的对象可被回收.
Java中的GC Roots包含以下内容:
- 虚拟机栈中引用的对象.
- 本地方法栈中引用的对象.
- 方法区中类静态属性引用的对象.
- 方法区中常量引用的对象