目录
- 1. 堆(Heap)
- 存储内容
- 与线程关系
- 2. 栈(Stack)
- 存储内容
- 与线程关系
- 3. 方法区(Method Area)
- 存储内容
- 与线程关系
- 变动
1. 堆(Heap)
存储内容
-
对象实例(对象实例的全部数据,包括实例变量、对象头等)
-
字符串常量池(String Table,JDK 7+ 移至堆)
与线程关系
- 线程共享:所有线程共用堆内存。
2. 栈(Stack)
存储内容
- 方法调用栈帧(每个方法对应一个栈帧)
- 局部变量表(Local Variable Table):存储编译期间的各种基本数据类型、对象引用(reference类型,不是对象本身)和returnAddress类型。
- 操作数栈(Operand Stack):用于计算和临时存储数据。
- 动态链接(Dynamic Linking):指向运行时常量池的方法引用。
- 方法返回地址(Return Address):记录方法执行完后的返回位置。
与线程关系
- 线程私有:每个线程有独立的栈内存。
3. 方法区(Method Area)
存储内容
- 类型信息(类名、方法、字段、常量池等)
- 静态变量(static)
- 常量
- 即时编译器编译后的代码缓存
即时编译器(JIT):将热点代码(频繁被使用的代码)编译成机器码,以提高执行效率
与线程关系
- 线程共享:所有线程共用方法区。
变动
- JDK 8+ 由 Metaspace 取代:
- 永久代(PermGen)(JDK 7 及之前)受
-XX:MaxPermSize
限制,容易OOM。 - 元空间(Metaspace)(JDK 8+)使用本地内存(Native Memory),默认无上限(受系统内存限制)。
- 永久代(PermGen)(JDK 7 及之前)受