判断对象是否能够回收

Java 判断对象是否能够被回收,是根据对象是否被引用来决定的。如果对象被引用了,说明对象还在使用,不允许被回收。

Untitled

引用计数法

引用计数法为每个对象维护一个引用计数器,对象被引用时 + 1,取消引用时 - 1。

Untitled

垃圾回收的时候扫描所有计数器为 0 的对象,并进行回收。C++ 的智能指针实现了该方法

优点:简单

缺点:存在循环引用问题,没法回收

可达性分析算法

由于引用计数法不能解决循环引用问题,所以 Java 使用可达性分析算法来判断对象是否可以被回收。可达性分析将对象分为两类:垃圾回收的根对象(GC Root)和普通对象,对象与对象之间存在引用关系。

下图中 A 到 B 再到 C 和 D,形成了一个引用链,可达性分析算法指的是如果从某个到 GC Root 对象是可达的,对象就不可被回收。

四类 GC Root 对象

如何查看 GC Root

Untitled