我正在尝试理解有关GC G1的一些内容,希望你们能帮助我。
- GC G1中整个并发标记阶段的作用是什么?我的意思是所有部分(初始标记,根区域扫描,...,清理)。
据我所知,它的作用是标记从根区域可达的所有活动对象(在并发标记阶段中,这些对象是在“初始标记”部分中选择的幸存者区域),并估计老区域的存活率(基于此,它们将被选择为混合疏散暂停的收集集)。我是对的吗?
- 在混合疏散暂停期间,哪些对象被标记为垃圾?
如果我理解正确,混合疏散暂停会标记和删除GC根和已记忆集无法访问的对象。这是与并发标记标记的不同对象,因此这些对象可能重叠但不必如此。我是对的吗?
GC根到底是什么?它们在年轻代和混合收集时是否相同(除了混合收集中来自已记忆集的引用)?
下面是我的总结,是否正确?
完全年轻代收集标记所有活动对象(这意味着对于GC根是可达的)从伊甸园和幸存者区域,并将它们疏散(复制)到新的幸存者(或旧的)区域。其余的对象被视为垃圾并被删除。空闲区域被回收。
在并发标记阶段开始时,标记可能具有对老年代区域的引用的所有幸存者区域(基于已记忆集?)。在此过程中,幸存者区域被视为GC根,因为此部分发生在完全年轻代收集期间,因此我们确定其中所有对象都是活的。然后,GC遍历对象图(从所选的幸存者区域的对象开始),并标记所有活动对象。
在混合疏散暂停期间,根据存活率统计信息(在上一阶段中计算),选择某些老年代区域进入收集集。然后,从所选区域中的所有活动对象疏散(复制)到新区域(活动对象的意思是:a.在并发标记期间被选择和b.如在标准疏散暂停期间 - 可达GC根和已记忆集的对象)。其余的对象被视为垃圾,区域被回收。
static
变量来实现,因此不需要将任何静态变量视为GC根。然而,一些实现会采取捷径,仅针对引导加载程序、扩展/平台加载程序和应用程序(也称为系统加载器),因为它们永远不会消失;或者对于所有静态变量,如果它们不支持类卸载。关于第一个观点,方法参数 是 局部变量,同样适用于字节码级别的this
。 - Holger