我最近开始研究Java等语言中使用的垃圾收集器(GC)。其中,我对跟踪(或标记和清除)GC特别感兴趣,如G1(垃圾优先)。在阅读了一些文章和wiki之后,我认为我现在有了一个高层次的看法。
然而,我仍然对在标记阶段标记可达对象所执行的对象图遍历中的一些细节感到困惑。
据我所知,G1 GC从根开始扫描被访问对象的堆内存,并查找引用变量(存储在其区域中),以找到其他要访问的对象(而不是在运行时维护实际的对象图并遍历它)。
关于堆内存扫描,谁能解释一下G1 GC如何确定对象中的哪个内存位置存储引用变量?
例如,给定一个对象A,它可以包含N个引用变量作为类成员,对于对象A,GC如何知道有多少引用变量,以及它们存储在哪个偏移量......?
我知道记忆集合、卡片表等技术,但据我了解,这些都是为了优化,我特别好奇的是内存扫描的方式。
另外,请不要说只是像“GC存储一些元数据来计算那些信息”。如果可能的话,我希望听到实际的(或详细的)实现。
提前感谢大家,祝大家新年快乐!
1条答案
按热度按时间vc6uscn91#
对象A的类的定义指定哪些字段是引用。(对象A在一个总是可预测的位置--对象头-,包含一个对它的类的引用,该类保存了这些信息。)这就是全部答案。