JVM内存管理通过分代设计(新生代/老年代/元空间)、压力驱动的GC触发机制(Eden满触发Minor GC、老年代不足触发Full GC)及匹配代特征的回收算法(新生代用复制算法、老年代用标记-整理等),结合可达性分析判定对象存活,实现吞吐量、延迟与内存占用的动态平衡。

JVM 内存管理系统不是简单地分配和回收内存,而是通过分代管理、自动触发与协作式回收机制,在运行时动态平衡吞吐量、延迟和内存占用。核心逻辑在于“按对象生命周期分区域 + 按回收性价比选算法 + 按堆压力触发时机”三者联动。
内存被划分为几个逻辑区域
JVM 堆内存主要分为新生代(Young Gen)和老年代(Old Gen),部分实现还包含永久代(JDK 7 及以前)或元空间(Metaspace,JDK 8+)。其中:
- 新生代进一步细分为 Eden 区和两个 Survivor 区(S0/S1),新对象优先分配在 Eden;
- 对象经历多次 Minor GC 后仍存活,会被晋升到老年代(满足年龄阈值、大对象直接分配、Survivor 空间不足等条件);
- 元空间不在堆内,用于存放类的元数据,由本地内存(Native Memory)支持,避免永久代 OOM 的常见瓶颈。
GC 触发不是定时而是基于压力驱动
GC 不按固定时间执行,而由内存使用水位线和分配失败等事件触发:
- Eden 区满时触发 Minor GC(也称 Young GC),清理新生代,存活对象复制到 Survivor 或晋升老年代;
- 老年代空间不足、Minor GC 后晋升失败、显式调用 System.gc()(仅建议)等场景可能触发 Major GC 或 Full GC;
- 现代 JVM(如 G1、ZGC)还会监控预测停顿时间、垃圾占比、并发标记进度等指标,动态调整回收节奏。
不同代采用不同回收算法
分代设计的本质是利用“大部分对象朝生暮死”的经验规律,让算法匹配区域特征:
- 新生代常用复制算法(Copying):只需复制存活对象,效率高、无碎片,适合短生命周期对象密集场景;
- 老年代多用标记-整理(Mark-Compact)或标记-清除(Mark-Sweep):前者避免碎片(如 Serial Old、Parallel Old),后者配合压缩策略(如 CMS 已废弃,G1 默认混合回收);
- ZGC 和 Shenandoah 则通过读屏障 + 并发转移,实现几乎不受堆大小影响的亚毫秒级停顿。
对象能否被回收取决于可达性分析
JVM 判断对象是否存活,不依赖引用计数(存在循环引用问题),而是以 GC Roots 为起点做可达性分析:
- GC Roots 包括:虚拟机栈中引用的对象、方法区中类静态属性引用的对象、常量引用的对象、本地方法栈中 JNI 引用的对象;
- 从这些根出发,所有能被直接或间接引用到的对象视为“存活”,其余则标记为可回收;
- finalize() 方法已被弃用(JDK 9 起标记为 deprecated),不应作为资源清理手段,推荐使用 try-with-resources 或 Cleaner 替代。

















