引用计数法会为每个对象维护一个引用计数器,当对象被引用时加1,取消引用时减1,存在循环引用问题所以Java没有使用这种方法
Java使用的是可达性分析算法来判断对象是否可以被回收。可达性分析将对象分为两类:垃圾回收的根对象(GC Root)和普通对象。
可达性分析算法指的是如果从某个到GC Root对象是可达的,对象就不可被回收。最常见的是GC Root对象会引用栈上的局部变量和静态变量导致对象不可回收
哪些对象被称之为GC Root对象呢?
● 线程Thread对象,引用线程栈帧中的方法参数、局部变量等。
● 系统类加载器加载的java.lang.Class对象,引用类的静态变量。
● 监视器对象,用来保存同步锁synchronized关键字持有的对象。
● 本地方法调用时使用的全局对象。