发布于2026-07-06 阅读(0)
扫一扫,手机访问
今天我们来聊聊垃圾收集器里一个容易被忽视但至关重要的细节:卡表。Parallel 和 G1 都用它,但背后的设计理念和实现方式却截然不同。基本机制大家都知道,但它们在 JVM 实际运行中到底是怎么各司其职的?从跨代引用的处理路径入手,能非常清晰地看出两位“选手”的取舍与哲学。

Parallel Sca venge 和 ParallelOld 这对组合,卡表就是跨代引用处理的唯一支柱。它的实现方式非常直接:
这套设计逻辑非常清晰:追求极致的吞吐量。写屏障开销极低,卡表遍历也快,非常适合 CPU 密集、对停顿时间不那么敏感的批处理场景。代价呢?每次 Minor GC 都得把脏卡从头到尾重新解析一遍,而且这种设计不支持部分回收或者分区级别的精细控制。
G1 的思路完全不同。它没有把卡表当作最终的引用记录工具,而是把它降级为“脏页探测器”,真正干活的是背后那套更精细的 Remembered Set。
换句话说,G1 里的卡表不参与 GC 实时决策,它只负责“采集线索”。RSet 才是真正的“引用目录”。这种分离的设计,让 G1 能够支持并发 refinement、可预测的暂停时间以及混合收集(Mixed GC),但代价是更高的内存占用和写屏障带来的额外延迟。
虽然表面上看都是用卡表,但两者在 JVM 体系里扮演的角色天差地别:
归根结底,Parallel 把卡表用到了极致的“够用即止”,而 G1 则把卡表作为更大系统的一块基石,让它服务于更复杂、更精细的回收策略。两者没有绝对的好坏,只看你的应用场景更需要哪一头。
上一篇:Instrumentation接口:实现JavaAgent变量字节码增强
下一篇:DataInputStream 的 readLong():解析 Java 字节序如何将 8 字节变量拼装为 64 位整数
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8