Java 判断对象是否能够被回收,是根据对象是否被引用来决定的。如果对象被引用了,说明对象还在使用,不允许被回收。
引用计数法为每个对象维护一个引用计数器,对象被引用时 + 1,取消引用时 - 1。
垃圾回收的时候扫描所有计数器为 0 的对象,并进行回收。C++ 的智能指针实现了该方法
优点:简单
缺点:存在循环引用问题,没法回收
由于引用计数法不能解决循环引用问题,所以 Java 使用可达性分析算法来判断对象是否可以被回收。可达性分析将对象分为两类:垃圾回收的根对象(GC Root)和普通对象,对象与对象之间存在引用关系。
下图中 A 到 B 再到 C 和 D,形成了一个引用链,可达性分析算法指的是如果从某个到 GC Root 对象是可达的,对象就不可被回收。
线程 Thread 对象:引用线程栈帧中的方法参数、局部变量等
系统类加载器加载的 java.lang.Class 对象:
引用类中的静态变量
监视器对象,用来保存同步锁 synchronized 关键字持有的对象
本地方法调用时使用的全局对象