我昨天读了有关垃圾收集的内容,但我不明白其中的一些概念。我读到,对于次要收集,通常使用复制技术将可访问的对象移动到幸存者空间,而对于主要收集,它通常使用标记和清除。
我首先不明白的是,垃圾收集器从 gc 根开始,沿着图移动以检测 Activity 实例,但它如何知道哪个对象是年轻的,哪个对象是旧的?它如何知道对象驻留在哪个内存区域?
第二件事是,如果我们只进行次要收集,GC如何知道年轻代中的对象是否未被老年代中的对象引用或方法区中的静态引用?
最后一件事是,在标记和扫描之后,有时会进行压缩。 gc 如何知道哪些对已移动对象的引用必须更新?如果我们的程序有数千个线程,并且使用了巨大的帧堆栈和千兆字节的堆?它是否有一些内部结构以 map 或其他形式提供该信息?
谢谢!
最佳答案
YoungGen/OldGen 和 PermGen 是 Java 堆所在的三个区域。 JVM 熟悉每个的边界。
在收集垃圾时,GC 首先决定运行哪个空间,然后识别该空间中每个对象的 GC 根。一个对象是年轻的还是老的,由它在堆中所在的空间指定。 GC 也维护每个对象的状态,例如每个对象存活了多少个 GC 周期,这使 GC 可以估计将对象从 Young 移动到 Old 的时间是否合适。
对象图决定年轻一代对象是否被老一代引用所引用。
如果对象被压缩,引用也会更新。当对象从年轻一代 > 老一代移动时,也会发生这种情况。
关于Java 内存区域和垃圾收集器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26036242/