運行時數據區:
1.程序計數器( Program Counter Register)
當前線程所執行的字節碼的行號指示器。線程私有
此內存區域是唯一一個在Java 虛擬機規范中沒有規定任何 OutOfMemoryError 情況的區域。
2..Java 虛擬機棧(JavaVirtual Machine Stacks)
線程私有的,它的生命周期與線程相同。每個方法被執行的時候都會同時創建一個棧幀( Stack Frame)用于存儲局部變量表、操作棧、動態鏈接、方法出口等信息。方法執行的過程對應棧幀從入棧到出棧的過程。
如果線程請求的棧深度大于虛擬機所允許的深度,將拋出 StackOverflowError 異常,如果虛擬機棧擴展時無法申請到足夠的內存時會拋出 OutOfMemoryError 異常。
3.本地方法棧( Native Method Stacks)
與虛擬機棧所發揮的作用是非常相似的,其區別不過是虛擬機棧為虛擬機執行 Java 方法(也就是字節碼)服務,而本地方法棧則是為虛擬機使用到的 Native方法服務。有的虛擬機(譬如 Sun HotSpot 虛擬機)直接就把本地方法棧和虛擬機棧合二為一。
4.Java 堆
Java堆是被所有線程共享的一塊內存區域,在虛擬機啟動時創建,存放對象實例。Java 堆是垃圾收集器管理的主要區域。Java堆又會劃分新時代,老年代,如果從內存分配的角度看,線程共享的 Java 堆中可能劃分出多個線程私有的分配緩沖區。堆內存中可分為兩個大區域,一塊是Young Generation(新生代),另一塊是Old Generation(老生代Old區)。
5.方法區( Method Area)
與 Java 堆一樣,是各個線程共享的內存區域,它用于存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。運行時常量池( Runtime Constant Pool)比如字符串池、是方法區的一部分