「对象什么时候进入老年代?」常见回答是「年龄超过 15」,但真实的 JVM 比这复杂。这篇用 Serial GC 的日志把对象的年龄、有效阈值、大对象直接分配和幸存区溢出一个个量出来(G1 的 Region 与停顿目标见下一篇)。
GC #1:有效晋升阈值 3(上限 3),幸存区期望 1024 KB,幸存区里 (age, KB) = [(1, 494)];GC 后老年代 1056 KB,幸存区 494 KB GC #2:有效晋升阈值 3(上限 3),幸存区期望 1024 KB,幸存区里 (age, KB) = [(1, 233), (2, 490)];GC 后老年代 1056 KB,幸存区 724 KB GC #3:有效晋升阈值 3(上限 3),幸存区期望 1024 KB,幸存区里 (age, KB) = [(2, 233), (3, 490)];GC 后老年代 1056 KB,幸存区 724 KB GC #4:有效晋升阈值 3(上限 3),幸存区期望 1024 KB,幸存区里 (age, KB) = [(1, 0), (3, 233)];GC 后老年代 1546 KB,幸存区 234 KB GC #5:有效晋升阈值 3(上限 3),幸存区期望 1024 KB,幸存区里 (age, KB) = [(2, 0)];GC 后老年代 1780 KB,幸存区 0 KB GC #6:有效晋升阈值 3(上限 3),幸存区期望 1024 KB,幸存区里 (age, KB) = [(3, 0)];GC 后老年代 1780 KB,幸存区 0 KB GC #7:有效晋升阈值 3(上限 3),幸存区期望 1024 KB,幸存区里 (age, KB) = [];GC 后老年代 1781 KB,幸存区 0 KB
GC #1:有效晋升阈值 1(上限 3),幸存区期望 1024 KB,幸存区里 (age, KB) = [(1, 1262)];GC 后老年代 1056 KB,幸存区 1262 KB GC #2:有效晋升阈值 3(上限 3),幸存区期望 1024 KB,幸存区里 (age, KB) = [(1, 233)];GC 后老年代 2314 KB,幸存区 233 KB GC #3:有效晋升阈值 3(上限 3),幸存区期望 1024 KB,幸存区里 (age, KB) = [(2, 233)];GC 后老年代 2314 KB,幸存区 233 KB GC #4:有效晋升阈值 3(上限 3),幸存区期望 1024 KB,幸存区里 (age, KB) = [(1, 0), (3, 233)];GC 后老年代 2314 KB,幸存区 234 KB GC #5:有效晋升阈值 3(上限 3),幸存区期望 1024 KB,幸存区里 (age, KB) = [(2, 0)];GC 后老年代 2548 KB,幸存区 0 KB GC #6:有效晋升阈值 3(上限 3),幸存区期望 1024 KB,幸存区里 (age, KB) = [(3, 0)];GC 后老年代 2548 KB,幸存区 0 KB GC #7:有效晋升阈值 3(上限 3),幸存区期望 1024 KB,幸存区里 (age, KB) = [];GC 后老年代 2549 KB,幸存区 0 KB
分配前:老年代 1056 KB,Eden 1966 KB,GC 次数 0 分配 512 KB 数组后:老年代 1056 KB,Eden 2806 KB 再分配 2 MB 数组后:老年代 3104 KB,Eden 3134 KB,GC 次数 0
SurvivorRatio=8: GC #1:有效晋升阈值 15(上限 15),幸存区期望 1024 KB,幸存区里 (age, KB) = [(1, 238)];GC 后老年代 4128 KB,幸存区 238 KB GC #2:有效晋升阈值 15(上限 15),幸存区期望 1024 KB,幸存区里 (age, KB) = [(1, 233), (2, 234)];GC 后老年代 4128 KB,幸存区 468 KB GC #3:有效晋升阈值 15(上限 15),幸存区期望 1024 KB,幸存区里 (age, KB) = [(2, 233), (3, 234)];GC 后老年代 4128 KB,幸存区 468 KB GC #4:有效晋升阈值 15(上限 15),幸存区期望 1024 KB,幸存区里 (age, KB) = [(1, 0), (3, 233), (4, 234)];GC 后老年代 4128 KB,幸存区 469 KB GC #5:有效晋升阈值 15(上限 15),幸存区期望 1024 KB,幸存区里 (age, KB) = [(2, 0), (4, 233), (5, 234)];GC 后老年代 4128 KB,幸存区 469 KB GC #6:有效晋升阈值 15(上限 15),幸存区期望 1024 KB,幸存区里 (age, KB) = [(3, 0), (5, 233), (6, 234)];GC 后老年代 4128 KB,幸存区 469 KB GC #7:有效晋升阈值 15(上限 15),幸存区期望 1024 KB,幸存区里 (age, KB) = [(4, 0), (6, 233), (7, 234)];GC 后老年代 4128 KB,幸存区 469 KB SurvivorRatio=2: GC #1:有效晋升阈值 1(上限 15),幸存区期望 2560 KB,幸存区里 (age, KB) = [(1, 3310)];GC 后老年代 1056 KB,幸存区 3310 KB GC #2:有效晋升阈值 15(上限 15),幸存区期望 2560 KB,幸存区里 (age, KB) = [(1, 233)];GC 后老年代 4362 KB,幸存区 233 KB GC #3:有效晋升阈值 15(上限 15),幸存区期望 2560 KB,幸存区里 (age, KB) = [(2, 233)];GC 后老年代 4362 KB,幸存区 233 KB GC #4:有效晋升阈值 15(上限 15),幸存区期望 2560 KB,幸存区里 (age, KB) = [(3, 233)];GC 后老年代 4362 KB,幸存区 233 KB GC #5:有效晋升阈值 15(上限 15),幸存区期望 2560 KB,幸存区里 (age, KB) = [(1, 0), (4, 233)];GC 后老年代 4362 KB,幸存区 234 KB GC #6:有效晋升阈值 15(上限 15),幸存区期望 2560 KB,幸存区里 (age, KB) = [(2, 0), (5, 233)];GC 后老年代 4362 KB,幸存区 234 KB GC #7:有效晋升阈值 15(上限 15),幸存区期望 2560 KB,幸存区里 (age, KB) = [(3, 0), (6, 233)];GC 后老年代 4362 KB,幸存区 234 KB