JVM优化入门指南:JVM新生代、老年代的核心概念与内存分配逻辑

1. JVM 内存结构概览

JVM内存分为栈内存、堆内存、方法去、程序计数器。

其中堆内存主要划分为两个区域:

  • 新生代(Young Generation)
  • 老年代(Old Generation / Tenured Generation)

2. 新生代(Young Generation)

组成部分:
  • Eden 区:大多数对象在此创建。
  • Survivor 区(S0 和 S1):用于存放从 Eden 中经过一次 Minor GC 后仍然存活的对象。
特点:
  • 大多数对象生命周期短,因此会很快被回收。
  • 发生垃圾回收频率高但速度快,称为 Minor GCYoung GC
分配流程:
  1. 对象优先在 Eden 分配;
  2. Eden 满时触发 Minor GC;
  3. 存活对象进入其中一个 Survivor 区(如 S0);
  4. 下次 GC 时,Eden 和 S0 中存活对象移至另一个 Survivor(如 S1),并交换角色;
  5. 若对象年龄达到阈值(默认 15),则晋升到老年代。

3. 老年代(Old Generation)

存放内容:
  • 生命周期较长的对象;
  • 从新生代多次 GC 后仍存活的对象;
  • 大对象可能直接分配进老年代(可通过 -XX:PretenureSizeThreshold 设置);
回收机制:
  • 使用标记-清除或标记-整理算法;
  • 触发 Full GC,耗时更长且影响性能。
触发条件:
  • 老年代空间不足;
  • 方法区(元空间)满;
  • 显式调用 System.gc()(不一定执行);

4. 常见参数配置

参数 描述
-Xms / -Xmx 初始堆大小 / 最大堆大小
-XX:NewRatio 老年代与新生代比例,默认为 2(即老年代占 2/3)
-XX:SurvivorRatio Eden 与一个 Survivor 的比例,默认为 8
-XX:MaxTenuringThreshold 对象晋升到老年代的最大年龄

总结

JVM 内存模型根据对象生命周期的不同将堆内存划分为新生代和老年代,并采用不同的垃圾收集策略优化效率。了解这些有助于调优应用性能及排查 OOM 异常等问题。

相关推荐
玄同7654 小时前
从 0 到 1:用 Python 开发 MCP 工具,让 AI 智能体拥有 “超能力”
开发语言·人工智能·python·agent·ai编程·mcp·trae
czy87874754 小时前
深入了解 C++ 中的 `std::bind` 函数
开发语言·c++
消失的旧时光-19434 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed
yq1982043011564 小时前
静思书屋:基于Java Web技术栈构建高性能图书信息平台实践
java·开发语言·前端
一个public的class4 小时前
你在浏览器输入一个网址,到底发生了什么?
java·开发语言·javascript
有位神秘人4 小时前
kotlin与Java中的单例模式总结
java·单例模式·kotlin
Jinkxs4 小时前
Gradle - 与Groovy/Kotlin DSL对比 构建脚本语言选择指南
android·开发语言·kotlin
&有梦想的咸鱼&4 小时前
Kotlin委托机制的底层实现深度解析(74)
android·开发语言·kotlin
golang学习记4 小时前
IntelliJ IDEA 2025.3 重磅发布:K2 模式全面接管 Kotlin —— 告别 K1,性能飙升 40%!
java·kotlin·intellij-idea
爬山算法4 小时前
Hibernate(89)如何在压力测试中使用Hibernate?
java·压力测试·hibernate