GC管理的主要区域是Java堆,一般情况下只针对堆进行垃圾回收。方法区、JVM栈和Native栈不被GC所管理,因而选择这些非堆区的对象作为GC roots,被GC roots引用的对象不被GC回收。
一个对象可以属于多个root,GC root有几下种:
Class - 由系统类加载器(system class loader)加载的对象,这些类不可以被回收,他们可以以
静态字段的方式持有其它对象。我们需要注意的一点就是,
通过用户自定义的类加载器加载的类,除非相应的java.lang.Class实例以其它的某种(或多种)方式成为roots,否则它们并不是roots,.Thread - 活着的线程Stack Local - Java方法的local变量或参数(存在于所有Java线程当前活跃的栈帧里,它们会指向堆里的对象)【Java类的
运行时常量池里的引用类型常量(String或Class类型)】(先不考虑)
【String常量池(StringTable)里的引用】(先不考虑)JNI Local - JNI方法的local变量或参数JNI Global - 全局JNI引用Monitor Used - Monitor被持有,用于同步互斥的对象Held by JVM -
用于JVM特殊目的由GC保留的对象,但实际上这个与JVM的实现是有关的。可能已知的一些类型是:
系统类加载器、一些JVM知道的
重要的异常类、一些用于处理异常的
预分配对象以及
一些自定义的类加载器等。JVM的一些静态数据成员会指向堆里的对象
GC收集那些不是GC roots且没有被GC roots引用的对象。
转载于:https://www.cnblogs.com/genggeng/p/10074016.html