​今天我们一起来聊一聊 JVM 堆内存。

📅 2026/6/30 18:16:04
​今天我们一起来聊一聊 JVM 堆内存。
ava Heap堆内存由Young Generation新生代约占1/3和Old Generation老年代约占2/3组成。Young Generation又由Eden Space伊甸园区占新生代80%、Survivor Space 0幸存者区0占新生代10%和Survivor Space 1幸存者区1占新生代10%组成。对象的生命周期Young Generation新生代存储新创建、存活周期极短的对象比如方法内的局部变量、临时对象。默认占堆总容量1/3。触发Minor GC新生代 GC频率极高毫秒 / 秒级但耗时极短几十毫秒。Eden 区是 Minor GC 的 触发源头调大 Eden 区可减少 Minor GC 次数。Eden Space伊甸园区新对象的 默认出生地99% 的新对象都会优先分配到 Eden 区除非是超大对象直接进入老年代。占新生代80%。Survivor Space 0/1幸存者区 0/1简称 S0/S1也叫 From 区 / To 区新生代 GC 后存活对象的临时中转站避免存活对象直接进入老年代。两个区会动态互换角色。各占新生代10%合计 20%。S0 和 S1永远有一个是空的这是 JVM 的设计巧思。每经历一次 Minor GC存活对象的年龄 1。S0/S1 的交互示例① 初始状态Eden 有对象S0 有对象S1 为空② Eden 触发 Minor GC → 回收 EdenS0 的垃圾对象存活对象复制到 S1清空 EdenS0③ 此时 S1 非空、S0 为空两者角色互换S0To 区S1From 区④ 下次 Minor GC 重复上述过程存活对象在 S0/S1 之间来回复制。Old Generation老年代存储长期存活、体积较大的对象比如单例对象、缓存对象、经历多次 Minor GC 仍存活的对象。默认占堆总容量2/3。触发Major GC / Full GC频率极低但耗时极长。老年代大小决定 Full GC 频率 —— 老年代越大Full GC 频率越低但单次 Full GC 耗时越长。对象进入老年代的条件