复制算法在新生代高效运作,因其匹配“对象朝生夕死”特征:90%以上对象一次minor gc后即消亡,仅少量存活对象需复制;eden(80%)与双survivor(各10%)结构基于98%回收率优化,eden用指针碰撞快速分配;gc时仅扫描eden+from区,存活对象连续复制至to区,天然无碎片且复用指针碰撞;对象年龄达阈值(默认15)才晋升老年代,多数对象1–2次gc后消亡;复制时同步更新所有引用,单次遍历完成识别、搬运、更新、清理。

复制算法在新生代中高效运作,核心在于它精准匹配了“对象朝生夕死”这一典型特征——90%以上的新建对象在一次 Minor GC 后就不再存活,真正需要保留的只是极小一部分。这种低存活率让复制操作本身开销极小,同时规避了碎片整理和引用更新的复杂逻辑。
内存结构设计支撑快速分配与回收
HotSpot 将新生代划分为 Eden(80%)和两个 Survivor 区(From 和 To,各占10%),不是均分,而是基于实证数据(98%对象可回收)做的最优配比。Eden 区采用指针碰撞(Bump-the-pointer)方式分配对象:只需移动一个空闲指针,无需查找空闲块,分配速度接近寄存器操作。当 Eden 满时触发 Minor GC,仅需扫描 Eden + 当前 From 区,把存活对象复制到 To 区——因为存活对象少,实际复制的数据量很小。
存活对象集中搬运,天然消除碎片
复制过程会将所有存活对象连续、紧凑地写入 To 区起始位置,复制完成后直接清空 Eden 和 From 区整块内存。这带来两个关键优势:一是后续分配仍可用指针碰撞,无需维护空闲链表;二是完全避免内存碎片,老年代才需面对的“标记-整理”压力在新生代被彻底绕过。
年龄机制与晋升策略控制复制频次
每次成功复制到 Survivor 区的对象,年龄 +1;默认达到 15 岁(可通过 -XX:MaxTenuringThreshold 调整)才进入老年代。这意味着绝大多数对象在 1–2 次 Minor GC 后就消亡,根本不会在 Survivor 区反复复制;只有极少数长生命周期对象才会经历多次 From/To 交换。若某次复制发现 To 区空间不足,JVM 会直接将超额存活对象“担保晋升”至老年代,避免复制失败。
引用更新同步完成,无额外遍历成本
复制过程中,对象地址变更,JVM 在搬运的同时一并修正所有指向该对象的引用(包括栈帧、静态字段、其他对象字段等)。这一步与复制动作合并执行,不增加单独的扫描阶段——相比标记-清除算法需两次遍历(标记 + 清除),复制算法单次遍历即完成识别、搬运、更新、清理全部任务。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











