garbage-collection - 垃圾收集 - 根节点

标签 garbage-collection heap-memory stack-memory

我最近阅读了有关垃圾收集(主要是在 Java 中)的点点滴滴,一个问题仍未得到解答:JVM(或一般的运行时系统)如何跟踪当前事件的对象?

我知道对象是当前在堆栈上的对象,因此所有局部变量或函数参数都是对象。这种方法的问题在于,每当运行时系统检查当前堆栈中的内容时,它如何区分引用变量和简单的 int?不能,可以吗?

因此,必须有某种机制来允许运行时构建事件对象的初始列表以传递给标记扫描阶段......

最佳答案

我发现 greyfairer 提供的答案是错误的。 JVM 运行时不会通过查看用于将数据推送到堆栈上的字节码来从堆栈中收集根集。堆栈帧由 4 个字节(32 位结构)槽组成。每个槽可以是对堆对象或原始值(如 int)的引用。当需要 GC 时,运行时会从上到下扫描堆栈。对于每个插槽,它包含一个引用,如果:

a.它以 4 字节边界对齐。

湾槽中的值指向堆的区域(在下限和上限之间)。

C.分配位已设置。 allocbit 是一个标志,指示是否分配了与其对应的内存位置。

这是我的引用:http://www.ibm.com/developerworks/ibm/library/i-garbage2/ .

还有一些其他技术可以找到根集(不是在 Java 中)。例如,由于指针通常在 4/8 字节边界对齐,因此可以使用第一位来指示槽是原始值还是指针:对于原始值,第一位设置为 1。这样做的缺点是您只有 31 位(32 位 arch)来表示整数,并且对原始值的每个操作都涉及移位,这显然是一种开销。

此外,您可以在堆上分配包括 int 在内的所有类型。也就是说,所有的东西都是对象。然后堆栈帧中的所有插槽都是引用。

关于garbage-collection - 垃圾收集 - 根节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8481602/

相关文章:

解释器环境中的python垃圾收集和_下划线

c# - .net List<T> 修剪多余的部分

java - 无论如何要为 Tomcat 32 位设置更多的最大内存?为什么在 1GB 和 1.6GB 有硬墙限制

c++ - 为什么在 C++ 内存管理中,术语 "automatic"和 "dynamic"优于术语 "stack"和 "heap"?

string - 为什么 Rust 中的字符串文字是 &str 而不是 String?

java - 循环 GC 在映射中起作用吗?

go - 如果一个 child 正在使用,垃圾会收集父类吗?

android - 检测Android中的应用程序堆大小

java - 在运行时设置 JVM 堆大小

c - c中的局部变量似乎靠近堆栈内存