運行時數據區包括如下幾個部分:程序計數器,堆,java棧,本地方法棧,方法區java
1.程序計數器:當CPU須要執行指令時,須要從程序計數器中獲取當前須要執行的指令所在存儲單元的地址。用來指示執行哪條指令。數組
其大小不會隨程序的執行而發生改變。函數
2.Java棧:java方法執行的內存模型。存放的時一個個棧幀,每一個棧幀對應一個被調用的方法。spa
棧幀中包括:局部變量表、操做數棧、指向當前方法所屬的類的運行時常量池的引用、方法返回地址、附加信息。線程
局部變量表:存儲方法中的局部變量(包括在方法中聲明的非靜態變量以及函數形參)。在程序執行期間局部變量表的大小是不會改變的對象
3.本地方法棧:在JVM規範中沒強制規定。Java棧是爲執行Java方法服務,本地方法棧則是爲執行本地方法(Native Method)服務blog
4.堆:用來存儲對象自己以及數組(數組的引用存在java棧中)。堆被全部線程共享接口
5.方法區:存儲了每一個類的信息(類的名稱、方法信息和字段信息)、靜態變量、常量以及編譯器編譯後的代碼。在方法區中有一個很是重要的部分就是運行時常量池,它是每個類或接口的常量池的運行時表示形式,在類和接口被加載到JVM後,對應的運行時常量池就被建立出來。固然並不是Class文件常量池中的內容才能進入運行時常量池,在運行期間也可將新的常量放入運行時常量池中,好比String的intern方法。內存