JVM 运行时内存结构?
发布于
一、线程私有
- 程序计数器:记录当前线程执行的字节码行号,唯一不会 OOM 的区域。
- 虚拟机栈:每个方法调用创建一个栈帧,存局部变量、操作数栈、动态链接。栈深度过深抛 StackOverflowError。
- 本地方法栈:为 native 方法服务。
二、线程共享
- 堆:对象实例和数组,GC 主要区域,可分为新生代 + 老年代。
- 方法区(元空间):类信息、常量、静态变量、JIT 编译后的代码。JDK 8 后用本地内存(元空间)替代永久代。
三、直接内存
NIO 用的堆外内存,不受堆大小限制,但受物理内存限制,可能 OOM。