JVM内存结构分为线程私有区(程序计数器、虚拟机栈、本地方法栈)和线程共享区(堆、方法区/Metaspace、直接内存);堆分新生代(Eden、S0、S1)与老年代,Metaspace存放类元数据且位于本地内存,字符串常量池自JDK7起移至堆中。

Java JVM 的内存结构不是一块连续的内存,而是按功能划分为多个独立区域,每个区域有明确的生命周期、用途和垃圾回收策略。理解这些区域划分,是排查内存溢出、调优 GC 和分析堆转储(heap dump)的基础。
方法区(Metaspace,JDK 8+)
存放类的元数据:类名、字段、方法、常量池、运行时常量池等。JDK 8 之后,永久代(PermGen)被移除,改用本地内存实现的 Metaspace。它不再属于堆内存,大小默认仅受本地内存限制(可通过 -XX:MaxMetaspaceSize 限制)。当加载大量动态类(如反射、Groovy、OSGi 场景)时,容易触发 Metaspace OOM。
- 监控建议:用 jstat -gc <pid> 查看 MC(Metaspace Capacity)、MU(Metaspace Used)
- 调优提示:避免无节制生成类;合理设置 -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize
- 注意:字符串常量池(String Table)在 JDK 7+ 已移到堆中,不属于 Metaspace
堆(Heap)——对象实例的主要栖息地
所有通过 new 创建的对象实例和数组都分配在堆中,是 GC 主要管理区域。堆被进一步划分为新生代(Young Gen)和老年代(Old Gen),新生代又细分为 Eden 区、Survivor S0 和 S1 区(From/To)。对象优先分配在 Eden,经历多次 Minor GC 后存活对象进入 Survivor,再经若干次复制后晋升至老年代。
- 常见配置:-Xms(初始堆大小)、-Xmx(最大堆大小)应设为相同值,避免动态扩容开销
- 新生代比例:可用 -XX:NewRatio(如 2 表示老:新 = 2:1)或 -XX:SurvivorRatio(如 8 表示 Eden:S0:S1 = 8:1:1)
- 判断依据:频繁 Minor GC + 老年代缓慢增长 → 可能存在内存泄漏;Minor GC 频繁但回收效果差 → Survivor 空间过小或对象过早晋升
虚拟机栈与本地方法栈
每个线程私有,生命周期与线程一致。虚拟机栈存储局部变量表、操作数栈、动态链接、方法出口等信息;本地方法栈为 native 方法服务。栈深度受限于 -Xss 参数(如 -Xss512k)。栈空间不足会抛出 StackOverflowError(递归过深)或 OutOfMemoryError(线程数过多)。
立即学习“Java免费学习笔记(深入)”;
- 典型问题:高并发下创建大量线程,且 -Xss 设置过大 → 快速耗尽内存
- 优化方向:用线程池控制线程数量;对深度递归考虑迭代或尾递归优化(Java 不支持尾递归优化,需手动改写)
- 注意:栈中不存对象本身,只存对象引用(reference),对象实体仍在堆中
程序计数器(PC Register)
唯一一个没有规定 OutOfMemoryError 的 JVM 内存区域。每个线程独有,记录当前线程所执行字节码的行号(即下一条要执行的指令地址)。分支、循环、异常处理、线程恢复都依赖它。它是 JVM 实现多线程“伪并行”的关键支撑。
- 特点:占用内存极小,线程切换时由 JVM 自动维护
- 作用:保证字节码解释器能准确找到执行位置;是唯一支持分支跳转和线程上下文切换的寄存器级结构
- 无需调优,也几乎不会出问题
直接内存(Direct Memory)
并非 JVM 运行时数据区的一部分,但被频繁使用(如 NIO 的 ByteBuffer.allocateDirect())。它分配在本地内存(操作系统内存),不受 -Xmx 限制,但受系统总内存和 -XX:MaxDirectMemorySize(默认等于 -Xmx)约束。未及时清理 DirectByteBuffer 的 Cleaner 对象,会导致直接内存泄漏,表现为堆内存正常但 OOM。
- 排查手段:用 jstat -gc <pid> 中的 CCST(Compressed Class Space)不相关,需结合 NMT(Native Memory Tracking):启动加 -XX:NativeMemoryTracking=detail,再用 jcmd <pid> VM.native_memory summary
- 最佳实践:优先复用 DirectByteBuffer;避免在循环中频繁 allocateDirect;注意 Netty 等框架的池化机制


















