JVM內存劃分

運行時數據區:

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)比如字符串池、是方法區的一部分

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容