內存模型
五大區域
- 程序計數器(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();
}
}
}