现代垃圾收集器(如在 CLR、JVM 中)使用什么技术来判断哪个 堆对象 是 引用 从堆栈?
具体来说,VM 如何从知道堆栈开始的位置返回到解释对堆对象的所有本地引用?
最佳答案
在 Java 中(可能在 CLR 中,虽然我不太了解它的内部结构),字节码是用对象与原始信息输入的。因此,字节码中有数据结构描述每个堆栈帧中的哪些变量是对象,哪些是基元。当GC需要扫描根集时,它使用这些StackMapTables区分引用和非引用。
CLR 和 Java 必须有一些这样的机制,因为它们是精确的收集器。有像 boehm collector 这样的保守收藏家将堆栈上的每个偏移量视为可能的指针。他们查看该值(当被视为指针时)是否是堆中的偏移量,如果是,则将其标记为事件的。
关于garbage-collection - 垃圾收集器如何知道堆栈帧上的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10795505/