內(nèi)存模型
五大區(qū)域
- 程序計(jì)數(shù)器(PC)
- 虛擬機(jī)棧
- 本地方法棧
- 方法區(qū)(包含常量池)
- 堆
詳細(xì)介紹
1. 程序計(jì)數(shù)器
程序計(jì)數(shù)器 饱搏,簡稱PC(Program Counter Register)
內(nèi)容
- 存儲要運(yùn)行的字節(jié)碼地址
特點(diǎn)
- 線程私有,每個線程都有一個PC
- 當(dāng)執(zhí)行一個方法時(shí)弄捕,PC中存儲的是要執(zhí)行的字節(jié)碼地址
- 當(dāng)執(zhí)行一個本地方法時(shí)柒瓣,PC為空
異常
- 唯一一個不會發(fā)送OutOfMemory的區(qū)域
2. 虛擬機(jī)棧
Java Virtual Machine Stacks
內(nèi)容
- 局部變量
- 函數(shù)調(diào)用返回地址
特點(diǎn)
- 線程私有
- 聲明周期與線程相同
異常
- StackOverflow: 棧深度過大
- OutOfMemory: 內(nèi)存溢出
3. 本地方法棧
Native Method Stack
Native Method是指由非Java編寫的代碼
內(nèi)容
- Native方法的變量
特點(diǎn)
- 有些虛擬機(jī)將本地方法棧與虛擬機(jī)棧合二為一(如HotSpot)
異常
- StackOverflow: 棧深度過大
- OutOfMemory: 內(nèi)存溢出
4. 方法區(qū)
Method Area
內(nèi)容
- 類信息
- 常量蹭劈、靜態(tài)變量
- 編譯后的代碼
特點(diǎn)
異常
- OutOfMemory: 內(nèi)存溢出
5. 堆
Heap
內(nèi)容
- new出來的對象
特點(diǎn)
- JVM管理的最大一塊內(nèi)存,也是GC主戰(zhàn)場
分為新生代和老年代
異常
- OutOfMemory: 內(nèi)存溢出
·
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();
}
}
}