JVM 采用的是可达性分析算法。JVM 是通过 GC Roots来判定对象的存活的。从GC Roots 向下追溯、搜索,会产生一个叫做 Reference Chain 的链条。当一个对象不能和任何一个 GC Root 产生关系,就判定为垃圾。
GC Roots 大体包括:
1、活动线程相关的各种引用,比如虚拟机栈中栈帧里的引用。
2、类的静态变量的引用。
3、JNI 引用等。
当然也有比较详细的回答,个人认为这些就够了。详细版本如下:
1、Java线程中,当前所有正在被调用的方法的引用类型参数、局部变量、临时值等。也就是与我们栈帧相关的各种引用。
2、所有当前被加载的 Java 类。
3、Java 类的引用类型静态变量。
4、运行时常量池里的引用类型常量(String 或 Class 类型)。
5、JVM 内部数据结构的一些引用,比如 sun.jvm.hotspot.memory.Universe类。
6、用于同步的监控对象,比如调用了对象的 wait()方法。
7、JNI handles,包括 global handles 和 local handles

Was this helpful?

0 / 0

发表回复 0

Your email address will not be published.