JVM內存區域結構:一計兩棧一堆一區
1程序計數器
- 一塊較小的內存空間。
- 當前線程所執行的字節碼的行號指示器。
2虛擬機棧
描述的是Java方法執行的線程內存模型:每個方法被執行的時候,Java虛擬機都會同步創建一個棧(StackFrame)用于存儲局部變量表、操作數棧、 動態連接、方法出口等信息。每一個方法被調用直至執行完畢的過程,就對應著一個棧幀在虛擬機棧中從入棧到出棧的過程。
局部變量表(存放)
- 基本數據類型
- 對象引用
- returnAddress類型(指向了一條字節碼指令的地址)
異常
StackOverflowError:線程請求的棧深度大于虛擬機所允許的深度
OutOfMemoryError:棧擴展時無法申請到足夠的內存
3本地方法棧
虛擬機使用到的本地(Native)方法服務。
4Java堆回收內存的角度
新生代、老年代、永久代、Eden空間、From Survivor空間、To Survivor空間。
分配內存的角度
所有線程共享的Java堆中可以劃分出多個線程私有的分配緩沖區(Thread Local Allocation Buffer,TLAB)。
異常
OutOfMemoryError:沒有內存完成實例分配, 并且堆也無法再擴展時
5方法區
- 各個線程共享的內存區域
- 用于存儲已被虛擬機加載的類型信息、常量、靜態變量、即時編譯器編譯后的代碼緩存等數據
- JDK8將永久代廢棄,相應的用元空間MetaSpace
異常
OutOfMemoryError:無法滿足新的內存分配需求時
6運行時常量池
- 方法區的一部分
- 用于存放編譯期生成的各種字面量與符號引用, 這部分內容將在類加載后存放到方法區的運行時常量池中
異常
OutOfMemoryError:當常量池無法再申請到內存
7直接內存
不是虛擬機運行時數據區的一部分
本機直接內存的分配不會受到Java堆大小的限制
總結:
JVM內存區域結構包含:程序計數器、虛擬機棧、本地方法棧、Java堆、方法區。可以簡記為:一計兩棧一堆一區,方便記憶。
方法區包含運行時常量池,還有直接內存(NIO更常見)。
需要了解到每個區域是主要作用是什么,這樣才能更加牢固的掌握。