什么是 gc root

Posted 稚枭天卓

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是 gc root相关的知识,希望对你有一定的参考价值。

GC Roots原理
GC Roots基本思路就是通过一系列的称为“GC Roots”的对象作为起始点, 从这些节点开始向下搜索, 搜索所走过的路径称为引用链( Reference Chain),当一个对象到 GC Roots 没有任何引用链相连( 用图论的话来 说,就是从GC Roots到这个对象不可达)时,则证明此对象是不可用的。

GC Roots对象
常说的GC(Garbage Collector) Roots,特指的是垃圾收集器(Garbage Collector)的对象,GC会收集那些不是GC Roots且没有被GC Roots引用的对象。
一个对象可以属于多个root,GC Roots有以下几种:

Class - 由系统类加载器(system class loader)加载的对象,这些类是不能够被回收的,他们可以以静态字段的方式保存持有其它对象。我们需要注意的一点就是,通过用户自定义的类加载器加载的类,除非相应的Java.lang.Class实例以其它的某种(或多种)方式成为roots,否则它们并不是roots,.
Thread - 活着的线程
Stack Local - Java方法的local变量或参数
JNI Local - JNI方法的local变量或参数
JNI Global - 全局JNI引用
Monitor Used - 用于同步的监控对象
Held by JVM - 用于JVM特殊目的由GC保留的对象,但实际上这个与JVM的实现是有关的。可能已知的一些类型是:系统类加载器、一些JVM知道的重要的异常类、一些用于处理异常的预分配对象以及一些自定义的类加载器等。然而,JVM并没有为这些对象提供其它的信息,因此需要去确定哪些是属于"JVM持有"的了。

以上是关于什么是 gc root的主要内容,如果未能解决你的问题,请参考以下文章

JVM GC原理及调优的基本思路

JVMGC 可达性分析中哪些算是GC ROOT?

Day701.JVM GC原理及调优的基本思路 -深入拆解 Tomcat & Jetty

java--GC Root有哪些

Java -- 每日一问:谈谈你的GC调优思路?

系统运行缓慢,CPU 100%,以及Full GC次数过多问题的排查思路