jvm内存模型是gc行为的底层约束和执行依据,决定触发时机、回收区域、算法选择及对象去向;堆分代结构(新生代/老年代)直接关联gc类型与频率,各区域生命周期差异塑造算法取舍,线程私有区影响可达性判定,参数调优即微调模型边界与行为。

JVM 内存模型不是静态的结构图,而是 GC 行为的底层约束和执行依据。GC 的所有决策——什么时候触发、回收哪块区域、用什么算法、对象往哪儿去——全都依赖于内存模型中各区域的职责划分与协作逻辑。
堆的分代结构直接决定 GC 类型和频率
堆被明确划分为新生代(Eden + Survivor)和老年代,这是分代收集理论的物理落地:
- 对象优先在 Eden 分配,空间不足就触发 Minor GC,只清理新生代
- 多次 Minor GC 后仍存活的对象,按年龄阈值(默认15次,由
-XX:MaxTenuringThreshold控制)晋升到老年代 - 大对象(超过
-XX:PretenureSizeThreshold)直接进入老年代,避免复制开销 - 老年代空间不足或显式调用
System.gc()(不推荐),可能触发 Full GC,暂停时间更长、影响更大
各区域生命周期差异塑造 GC 算法选择
不同区域对象的存活特征,决定了对应 GC 算法的设计取舍:
- 新生代:对象“朝生暮死”,适合 复制算法(如 Eden → Survivor 复制),效率高、无碎片
- 老年代:对象长期存活,复制成本高,采用 标记-整理(如 Serial Old、G1 的混合回收)或 标记-清除(如 CMS,已废弃)
- 元空间(替代永久代):使用本地内存,GC 不管理其内部类元数据,但类卸载失败会间接导致老年代压力上升
线程私有区域不参与 GC,但影响对象可达性判定
GC 判定对象是否“存活”,靠的是 可达性分析,而根节点(GC Roots)主要来自线程私有区:
- 虚拟机栈中的局部变量、方法参数、临时引用
- 本地方法栈中 JNI 引用的对象
- 程序计数器虽不存引用,但保障线程上下文切换后 GC Roots 仍可准确定位
- 静态变量、常量池等则来自方法区(元空间),也作为 GC Roots 的一部分
参数调优本质是微调内存模型的边界与行为
所有常用 JVM 参数,都是在调整内存模型中各区域的大小、比例或策略:
-
-Xms/-Xmx:设定堆的初始与最大容量,影响 Full GC 触发时机 -
-Xmn:指定新生代大小,过小会导致频繁 Minor GC;过大可能推迟晋升,加重老年代压力 -
-XX:SurvivorRatio:控制 Eden 与 Survivor 区比例(如 8 表示 Eden:Survivor=8:1:1),影响对象在 Survivor 中的“熬轮次”能力 -
-XX:+UseG1GC或-XX:+UseZGC:不只是换 GC 器,更是切换对堆的逻辑组织方式(如 G1 的 Region 分区模型)











