用于记录学习
另一方面,可达性分析算法:以一系列对象“GC Root”为起点,从这些节点开始向下搜索。 搜索通过的路径称为参考链(Reference Chain ),如果参考链没有从一个对象连接到GC Root,则该对象无法到达,该对象不可用,垃圾收集器占用其内存
在java语言中,可以用作GCRoot的对象包括:
a. java虚拟机堆栈(堆栈帧中的本地变量表)中引用的对象。
b .方法区域中的类静态属性引用的对象。
c .方法区域中的常量引用的对象。
d .本地方法堆栈中JNI本地方法的引用对象。
二、垃圾回收器(GC ) Roots实际上是垃圾回收器应回收的对象。 垃圾收集器回收不再被GC Roots引用的对象,而不是GC Roots引用的对象。
这里有几个GC Roots的对象。 一个对象可以属于多种类型的根。 有以下类型的根对象:
Class-由系统的类加载器加载的class。 此class无法卸载。 可以通过静态数据字段引用对象。 注意,在用户定制的类加载器中加载的Class不会充当GC Roots,除非相应的java.lang.Class实例碰巧是GC Roots对象
Thrad-生存线程
堆栈局部Java方法的变量或方法参数
JNI Local-JNI方法的变量或方法参数
JNI全局-全局JNI引用
Monitor Used-同步监视的对象
Held by JVM-JVM出于某些原因具有对垃圾收集器中几个对象的引用。 其实,这里关系到JVM本身的实现。 可能的原因之一是系统的类加载器、一些jvm本身已知的异常类、预分配的异常处理对象和加载类的自定义类加载器。 不幸的是,JVM很少提供其他详细信息来描述这些对象。 因此,这只是通过分析判断哪个对象是所谓的JVM持有的。
如果对象是GC Roots对象,则在所有视图中将进行特殊标记,以指示该对象是独立对象。 下图显示了Fragment的“对象视图”路径