新生代垃圾回收为啥使用标记复制算法?
新生代垃圾回收为啥使用标记复制算法?
月伴飞鱼新生代垃圾回收采用标记-复制(Mark-Copy)算法的原因,主要是因为它非常适合新生代的内存特点。
新生代特点:
对象生命周期短暂:大部分新生代对象(80%~90%)会很快变成垃圾,存活率低。
回收频率高:新生代内存回收频繁,效率要求高。
标记-复制算法原理:
将内存空间划分为两部分(通常是大小相同的两个区,如Survivor区),每次回收时:
标记存活对象。
将存活对象直接复制到另一块空闲内存区域。
原来的内存空间整体清空。
为什么新生代要用标记-复制?
回收效率高,速度快:
- 新生代大部分对象存活率低,复制存活对象成本低。
- 直接将存活对象复制走,剩余垃圾对象统一丢弃,不需要逐一回收,效率极高。
不产生内存碎片:
- 标记-复制后的存活对象全部集中存放,内存布局紧凑。
- 避免了老年代常见的内存碎片问题。
空间换时间的策略适合新生代:
- 新生代较小,复制成本低,即使浪费一部分内存空间,也能显著提升GC效率。
与标记-清除或标记-整理对比:
算法 | 速度 | 内存碎片 | 空间开销 | 适合场景 |
---|---|---|---|---|
标记-复制 | 快 | 无碎片 | 高(浪费一半空间) | 存活率低、新生代 |
标记-清除 | 慢 | 易产生碎片 | 低 | 存活率高、老年代 |
标记-整理 | 较慢 | 无碎片 | 低 | 存活率高、老年代 |
- 新生代垃圾多,适合牺牲空间换取极高效率。
- 老年代垃圾少,使用标记-清除或标记-整理避免空间浪费。
总结:
新生代之所以用标记-复制算法,根本原因是新生代对象死亡率极高。
标记-复制算法能以空间换时间的方式快速、高效地回收垃圾,同时避免碎片,满足新生代高频、快速的回收需求。