gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:13:28 25 4
gpt4 key购买 nike

我最近阅读了有关垃圾收集(主要是在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com