mark-compact算法在老年代的核心空间优势是彻底避免碎片且无需额外预留内存,通过就地紧凑排列存活对象实现近100%利用率,支撑大对象稳定分配并适配高存活率负载。

标记-整理(Mark-Compact)算法在老年代的核心空间优势,是它在不额外预留内存的前提下,彻底避免内存碎片,同时维持高内存利用率——这对长期运行、对象存活率高、需频繁分配大对象的场景至关重要。
不浪费空间:无需双倍内存担保
复制算法(如新生代的Eden+Survivor)必须预留一块等量空闲区用于搬运存活对象,相当于“用50%空间换效率”。而老年代通常占堆60%~80%,若照搬复制算法,就得再配同等大小空闲区,堆内存直接翻倍。Mark-Compact完全复用原有空间:标记后将存活对象向一端紧凑排列,腾出连续的空闲尾部,空间利用率接近100%。
消除碎片:支撑大对象稳定分配
标记-清除(Mark-Sweep)虽不移动对象、省时间,但会留下大量不连续空隙。当系统需要分配一个几MB的缓存对象或数组时,即使总空闲内存充足,也可能因找不到连续块而触发Full GC,甚至OOM。Mark-Compact通过整理,保证清理后的空闲区是完整、连续的一整块,让大对象可直接“指针碰撞”式快速分配,无需维护空闲列表或做复杂匹配。
适配老年代真实负载特征
新生代对象98%朝生夕灭,复制成本极低;老年代对象存活率常达70%~95%,复制意味着搬运海量数据,代价不可接受。Mark-Compact放弃“搬去别处”,选择“就地归位”:只移动存活对象、重写引用、压实布局。它用可预期的停顿时间(与存活对象数线性相关),换取了长期稳定的内存形态——这不是妥协,而是对空间效率与分配可靠性的精准平衡。
本质上,它的空间优势不在“快”,而在“稳”和“省”:不额外吃内存,不累积碎片,让老年代真正成为可信赖的长期存储区域。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











