一、运行时数据区
| 区域 | 存什么 | 线程 |
|---|---|---|
| 堆 Heap | 对象实例,GC 主战场 | 共享 |
| 方法区/元空间 | 类信息、常量、静态变量 | 共享 |
| 虚拟机栈 | 栈帧、局部变量表 | 私有 |
| 本地方法栈 | native 方法 | 私有 |
| 程序计数器 | 字节码行号 | 私有 |
二、栈帧与堆外
每次方法调用建栈帧(局部变量表 + 操作数栈 + 返回地址)。堆外/直接内存:NIO 的 DirectByteBuffer 绕过 JVM 堆,减少拷贝,但 -XX:MaxDirectMemorySize 超限会 OOM,且不受 GC 直接管理。
三、内存溢出类型
- Heap Space:堆太小或泄漏;
- Metaspace:动态生成类过多(CGLIB 代理);
- StackOverflow:无限递归;
- Direct buffer:堆外内存泄漏。
定位用 jstat/jmap/jstack 或 Arthas(详见本站 JVM 调优篇)。