老年代里的对象指向新生代时,G1 怎么在年轻代暂停里找到它们?这篇制造不同数量的老→新引用,读 GC 日志里的卡数与阶段耗时,看暂停是怎么变长的。
老→新引用 0 个/轮 年轻代暂停 11 次:平均暂停 3.84 ms;Merge Heap Roots 0.04 ms;Scan Heap Roots(各线程平均) 0.00 ms;脏卡 2;扫描的卡 2 1000 个/轮 年轻代暂停 11 次:平均暂停 3.91 ms;Merge Heap Roots 0.06 ms;Scan Heap Roots(各线程平均) 0.28 ms;脏卡 6549;扫描的卡 6548 50000 个/轮 年轻代暂停 13 次:平均暂停 6.46 ms;Merge Heap Roots 0.22 ms;Scan Heap Roots(各线程平均) 2.39 ms;脏卡 60080;扫描的卡 60080 400000 个/轮 年轻代暂停 19 次:平均暂停 10.27 ms;Merge Heap Roots 0.30 ms;Scan Heap Roots(各线程平均) 4.81 ms;脏卡 64985;扫描的卡 62482
GC(4) Pre Evacuate Collection Set: 0.11ms GC(4) Merge Heap Roots: 0.21ms GC(4) Prepare Merge Heap Roots: 0.00ms GC(4) Remembered Sets (ms): Min: 0.00, Avg: 0.00, Max: 0.00, Diff: 0.00, Sum: 0.02, Workers: 9 GC(4) Merged Cards Min: 16, Avg: 16.0, Max: 16, Diff: 0, Sum: 144, Workers: 9 GC(4) Dirty Cards: Min: 1314, Avg: 6702.7, Max: 11031, Diff: 9717, Sum: 60324, Workers: 9 GC(4) Skipped Cards: Min: 0, Avg: 0.0, Max: 0, Diff: 0, Sum: 0, Workers: 9 GC(4) Evacuate Collection Set: 6.03ms GC(4) Scan Heap Roots (ms): Min: 2.11, Avg: 2.18, Max: 2.39, Diff: 0.27, Sum: 19.62, Workers: 9 GC(4) Scanned Cards: Min: 3628, Avg: 6702.7, Max: 9245, Diff: 5617, Sum: 60324, Workers: 9 GC(4) Scanned Blocks: Min: 160, Avg: 425.6, Max: 968, Diff: 808, Sum: 3830, Workers: 9 GC(4) Post Evacuate Collection Set: 0.16ms GC(4) Redirtied Cards: Min: 1024, Avg: 4450.9, Max: 8219, Diff: 7195, Sum: 40058, Workers: 9 GC(4) Pause Young (Normal) (G1 Evacuation Pause) 189M->173M(1024M) 6.749ms
JDK 21: {'G1ConcRefinementThreads': '9', 'G1RSetUpdatingPauseTimePercent': '10'}
JDK 27: {'G1ConcRefinementThreads': '9', 'G1RSetUpdatingPauseTimePercent': '10', 'G1RemSetArrayOfCardsEntries': '16', 'G1RemSetHowlMaxNumBuckets': '8'}