JVM有一个回收算法是引用计数算法,每当对象被引用一次,就+1,释放一个引用就-1,当垃圾回收时,引用计数为0的对象就会被GC掉。但这个方法有个问题,就是无法解决循环引用的问题。
循环引用就是对象A引用了对象B,对象B引用了对象A,构成了一个引用环。彼此都没发挥什么作用,但却不会被GC。为了解决这个问题,就有了可达性分析回收算法。
可达性分析:
算法中定义了几个GC Root对象,这几个root对象在GC时不会被JVM回收掉,然后通过这些对象像树枝一样向外延伸,被引用到的对象说明还存活使用,就不会被GC,没有被这些root对象引用到的就会被GC掉。从而解决了循环引用问题。
Root对象主要包括:
①系统类加载器(bootstrap)加载的类。
②JVM方法区中静态属性引用的对象。
③JVM常量池中引用的对象。
④JVM虚拟机栈中引用的对象。
⑤JVM本地方法栈中引用的对象。
⑥活动着的线程。
官方解释:
GC roots
The so-called GC (Garbage Collector) roots are objects special for garbage collector. Garbage collector collects those objects that are not GC roots and are not accessible by references from GC roots.
There are several kinds of GC roots. One object can belong to more than one kind of root. The root