Java 面试题:JVM 内存模型与溢出类型

一、运行时数据区

区域 存什么 线程
堆 Heap 对象实例,GC 主战场 共享
方法区/元空间 类信息、常量、静态变量 共享
虚拟机栈 栈帧、局部变量表 私有
本地方法栈 native 方法 私有
程序计数器 字节码行号 私有

二、栈帧与堆外

每次方法调用建栈帧(局部变量表 + 操作数栈 + 返回地址)。堆外/直接内存:NIO 的 DirectByteBuffer 绕过 JVM 堆,减少拷贝,但 -XX:MaxDirectMemorySize 超限会 OOM,且不受 GC 直接管理。

三、内存溢出类型

  • Heap Space:堆太小或泄漏;
  • Metaspace:动态生成类过多(CGLIB 代理);
  • StackOverflow:无限递归;
  • Direct buffer:堆外内存泄漏。

定位用 jstat/jmap/jstack 或 Arthas(详见本站 JVM 调优篇)。