垃圾收集 - 根节点

Bob*_*r02 11 heap stack garbage-collection

我最近阅读了有关垃圾收集的部分内容(主要是在Java中),还有一个问题仍然没有答案:JVM(或一般的运行时系统)如何跟踪当前的活动对象?

我理解那里的对象是当前堆栈中的对象,所以所有的局部变量或函数参数都是ARE对象.这个问题的问题是每当运行时系统检查当前堆栈上的内容时,它如何区分引用变量和简单的int?它不能,可以吗?

因此,必须有某种机制允许运行时构建活动对象的初始列表以通过标记扫描阶段...

Rai*_*eld 6

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

一个.它以4字节边界对齐.

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

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

以下是我的参考:http://www.ibm.com/developerworks/ibm/library/i-garbage2/.

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

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