jvm運行時數據區域:方法區(公有)、堆(公有)、虛擬機棧(私有)、本地方法棧(私有)、程序計數器(私有)java
程序計數器:記錄的是正在執行的虛擬機字節碼指令的地址jvm
虛擬機棧:每一個方法在執行的同時都會建立一個棧幀用於存儲局部變量表、操做數棧、動態連接、方法出口等信息。方法調用--->棧幀在虛擬機棧中入棧過程,方法執行完成--->棧幀在虛擬機棧中出棧過程。函數
虛擬機棧會出現兩種異常:性能
- 若是線程請求的棧深度大於虛擬機所容許的深度,將拋出StackOverflowError異常;
- 若是虛擬機棧能夠動態擴展(當前大部分的Java虛擬機均可動態擴展,只不過Java虛擬機規範中也容許固定長度的虛擬機棧),若是擴展時沒法申請到足夠的內存,就會拋出OutOfMemoryError異常。
本地方法棧:線程
與虛擬機棧相似,爲本地方法服務,拋出兩種異常與虛擬機棧同樣code
Java堆:對象
- Java堆是被全部線程共享的一塊內存區域,在虛擬機啓動時建立。
- 此內存區域的惟一目的就是存放對象實例,幾乎全部的對象實例都在這裏分配內存。
- Java堆是垃圾收集器管理的主要區域,稱爲"GC堆"
- 若是在堆中沒有內存完成實例分配,而且堆也沒法再擴展時,將會拋出OutOfMemoryError異常。
能夠經過 -Xms 和 -Xmx 這兩個虛擬機參數來指定一個程序的堆內存大小,第一個參數設置初始值,第二個參數設置
最大值。blog
java -Xms1M -Xmx2M HackTheJava
方法區:接口
- 用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。
- 這區域的內存回收目標主要是針對常量池的回收和對類型的卸載
- 和堆同樣不須要連續的內存,而且能夠動態擴展,動態擴展失敗同樣會拋出 OutOfMemoryError 異常。
運行時常量池:內存
- 運行時常量池是方法區的一部分。
- Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池(Constant Pool Table),用於存放編譯期生成的各類字面量和符號引用,這部份內容將在類加載後進入方法區的運行時常量池中存放。
- 除了在編譯期生成的常量,還容許動態生成,例如 String 類的 intern()。
- 當常量池沒法再申請到內存時會拋出OutOfMemoryError異常。
直接內存:
在 JDK 1.4 中新引入了 NIO 類,它可使用 Native 函數庫直接分配堆外內存,而後經過 Java 堆裏的 DirectByteBuffer 對象做爲這塊內存的引用進行操做。這樣能在一些場景中顯著提升性能,由於避免了在堆內存和堆 外內存來回拷貝數據。