Java 中的 GC Roots
Java GC 面试 About 1,244 words判断是否会被回收
Java
使用的是可达性分析法,为了解决引用计数法的循环引用问题。
- 引用计数法
- 枚举根节点做可达性分析(根搜索路径)
基本思想
以GC Root
的对象为根节点,向下搜索。如果一个对象到GC Root
没有任何引用链相连时,则说明此对象不可用。
GC Root对象
哪些可以作为GC Root
对象:
- System Class:由自举/系统类加载器加载的类。例如:
rt.jar
中所有诸如java.util.*
的类。 - JNI Local:
native
代码中的本地变量。例如:用户定义的JNI
代码或JVM
内部代码。 - JNI Global:
native
代码中的全局变量。例如:用户定义的JNI
代码或JVM
内部代码。 - Thread Block:当前活跃的线程块中引用的对象。
- Thread:启动且未停止的线程(包括
main
线程)。 - Busy Monitor:其
wait()
或notify()
方法被调用,或被同步synchronized
的对象。例如:通过调用synchronized(Object)
或者进入其某个synchronized
方法。静态方法对应类,非静态方法对应对象。 - Java Local:本地变量。例如:仍在线程的栈中的方法输入参数或本地创建的对象。
- Native Stack:
native
代码的入或出参数。通常发生在许多方法有native
部分,方法参数处理的对象成为GC
根对象。例如:参数用于文件、网络I/O
或反射。 - Finalizer:在队列中等待其finalizer运行的对象。
- Unfinalized:拥有
finalize
方法,但是还没有被终结且不在finalizer
队列的对象。 - Unreachable:从其他根对象不可达的对象,但是被内存分析器标记为根对象。
- Unknown:没有根类型的对象。一些转储(
dump
),例如:IBM
可移植对转储文件,没有根信息。对于这些转储,内存分析器解析程序将没有被其他根对象引用的对象标记为此类根对象。
public class GcRootDemo {
// 成员变量是虚拟机栈引用的对象
private int[] array = new int[10];
// 静态属性是类静态属性引用的对象
public static Object o = new Object();
// 常量引用的对象
public static final String S = "abc";
// 成员方法是虚拟机栈顶引用的对象
public void testMethod() {
GcRootDemo gcRootDemo = new GcRootDemo();
}
}
参考
http://help.eclipse.org/indigo/topic/org.eclipse.mat.ui.help/concepts/gcroots.html
Views: 1,698 · Posted: 2022-05-19
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓
Loading...