【发布时间】:2021-02-28 08:07:23
【问题描述】:
根据这篇文章How Garbage Collection Works有四种Gc根:
- 局部变量由线程堆栈保持活动状态。这不是真实的对象虚拟参考,因此不可见。为了 所有意图和目的,局部变量都是 GC 根。
- 活动 Java 线程始终被视为活动对象,因此是 GC 根。这对于线程本地尤其重要
变量。- 静态变量由它们的类引用。这一事实使它们成为事实上的 GC 根源。类本身可以被垃圾收集,这将删除所有引用的静态变量。当我们通常使用应用程序服务器、OSGi 容器或类加载器时,这一点特别重要。我们将在问题模式部分讨论相关问题。
- JNI 引用是本机代码作为 JNI 调用的一部分创建的 Java 对象。这样创建的对象会被特殊处理,因为 JVM 不知道它是否被本机代码引用。此类对象代表了一种非常特殊的 GC 根形式,我们将在下面的问题模式部分进行更详细的研究。
在 JVM 规范中,堆栈帧中的局部变量没有类型,它只是一个字节数组,编译器负责为这些局部变量生成类型特定的指令,例如 iload、fload、aload 等。所以显然 GC 无法通过仅查看堆栈帧的局部变量部分来找到对对象的引用。
我的问题是:
-
GC 是如何找到这些根的?
-
GC 如何在堆栈中找到引用的局部变量 object 而不是其他类型的变量(例如iconst存储的实例变量)?
-
那么 Gc 如何找到这些对象的字段以创建可访问的 树?
-
它是否使用 JVM 自己定义的指令来查找那些 对象?
-
最后这句话在文章中是什么意思?
这不是真实对象的虚拟引用,因此不可见
【问题讨论】:
标签: java garbage-collection jvm