JVM規範將運行時數據區分爲6個部分。PC寄存器,棧,本地方法棧,堆,方法區。其中PC寄存器,棧,本地方法棧是線程私有的,後二者是線程共享的。數組
PC寄存器(程序計數器),它用來記錄當前線程運行的下一條字節碼指令的地址,或者說是是保存當前線程指令執行的指針。(沒有定義OutOfMemoryError)線程
JVM棧,每一個方法執行的時候同時建立一個棧幀,存儲局部變量表,操做數棧,動態連接,方法出口等信息。一個方法運行的過程就是入棧道出棧的過程。這個區域定義了兩種異常:若是請求的棧深度大於JVM所容許的深度,將拋出StackOverflowError。若是棧擴展時沒有足夠的內存,將拋出OutOfMemoryError。指針
本地方法棧,做用於JVM棧很是類似,只不過它執行的是本地Native方法,也定義了和JVM相同的異常。對象
Java堆,JVM所管理的最大的一塊內存,全部線程共享。幾乎全部的對象和數組都在堆上分配,也是GC管理的主要區域。經過-Xmx,-Xms參數來設置。若是堆中沒有可分配的內存,將拋出OutOfMemoryError.內存
方法區,與堆同樣是全部線程共享的區域,用於保存JVM加載的CLass信息、常量、靜態變量等數據。它屬於堆的一部分,在HotSpot虛擬機上也稱爲永久帶。虛擬機
常量池,這屬於方法區的一部分,主要用來存放編譯期生成的各類字面量與符號引用。運行時如String.intern()也能加入新的常量池。沒法申請內存時也將拋出OutOfMemoryError.編譯
直接內存,不是JVM運行時數據區的內存,也不是JVM規範定義的內存,例如NIO的DirectByteBuffer就分配在本機直接內存,也會出現OutOfMemoryError的狀況變量