内存模型
五大区域
- 程序计数器(PC)
- 虚拟机栈
- 本地方法栈
- 方法区(包含常量池)
- 堆
详细介绍
1. 程序计数器
程序计数器 ,简称PC(Program Counter Register)
内容
- 存储要运行的字节码地址
特点
- 线程私有,每个线程都有一个PC
- 当执行一个方法时,PC中存储的是要执行的字节码地址
- 当执行一个本地方法时,PC为空
异常
- 唯一一个不会发送OutOfMemory的区域
2. 虚拟机栈
Java Virtual Machine Stacks
内容
- 局部变量
- 函数调用返回地址
特点
- 线程私有
- 声明周期与线程相同
异常
- StackOverflow: 栈深度过大
- OutOfMemory: 内存溢出
3. 本地方法栈
Native Method Stack
Native Method是指由非Java编写的代码
内容
- Native方法的变量
特点
- 有些虚拟机将本地方法栈与虚拟机栈合二为一(如HotSpot)
异常
- StackOverflow: 栈深度过大
- OutOfMemory: 内存溢出
4. 方法区
Method Area
内容
- 类信息
- 常量、静态变量
- 编译后的代码
特点
异常
- OutOfMemory: 内存溢出
5. 堆
Heap
内容
- new出来的对象
特点
- JVM管理的最大一块内存,也是GC主战场
分为新生代和老年代
异常
- OutOfMemory: 内存溢出
·
OOM (OutOfMemory)
Stack Overflow
一个Stack Overflow例子
public class Main {
private int size = 1;
public void stackLeak(){
size++;
stackLeak();
}
public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
Main gg = new Main();
try{
gg.stackLeak();
}catch(Throwable e){
System.out.println(gg.size);
throw e;
//e.printStackTrace();
}
}
}