1. 程式人生 > >Java內存區域

Java內存區域

java方法 字節碼 style 描述 方法參數 指示器 data- 記錄 數組元素

方法區:用於存放已被虛擬機加載的類信息、常量、靜態變量、編譯器編譯後的代碼等數據。 當方法區無法滿足內存分配需求時,會拋出OutOfMemoryError異常。
方法區是線程共享的。

:在虛擬機啟動時創建,用於存放對象實例和數組元素。 如果堆中沒有內存完成實例分配,並且堆也無法擴展時,會拋出OutOfMemoryError異常。
堆是線程共享的。

虛擬機棧:虛擬機棧描述的是Java方法執行的內存模型:每個方法在執行的同時都會創建一個棧幀,用於存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。每一個方法從調用直至執行完成的過程,就對應著一個棧幀在虛擬機棧中入棧到出棧的過程。 局部變量表
:用於存放方法參數和方法內部定義的局部變量。 操作數棧:用於存放方法執行過程中的變量數據,如整數加法的字節碼指令iadd從棧頂取出兩個int型元素,執行加操作,然後將相加的結果入棧。 動態鏈接:Class文件的常量池中存有大量的符號引用,字節碼中方法調用指令就以常量池中指向方法的符號引用作為參數。這些符號引用一部分會在類加載階段或第一次使用的時候就轉化為直接引用,這種轉化稱為靜態解析。另外一部分在每一次運行期間轉化為直接引用,這部分稱為動態鏈接。 方法出口:一個方法開始執行後,只有兩種方式可以退出這個方法:一種是執行引擎遇到方法返回的字節碼指令,這種退出方式稱為正常完成出口;另一種是方法執行過程中遇到了異常,且這個異常沒有在方法體內得到處理,就會導致方法退出,這種退出方式稱為異常完成出口。一個方法使用異常完成出口的方式退出,是不回給它的上層調用者產生任何返回值的。 線程請求的棧深度大於虛擬機所允許的深度,將拋出StackOverflowError異常;如果虛擬機棧可以動態擴展,但是擴展時無法申請到足夠內存,會拋出OutOfMemoryError異常。

虛擬機棧是線程私有的。

本地方法棧:本地方法棧與虛擬機棧功能類似,只是本地方法棧服務於native方法。 本地方法棧同樣會拋出StackOverflowError異常和OutOfMemoryError異常。
本地方法棧是線程私有的。

程序計數器:當前線程鎖執行的字節碼的行號指示器。如果線程正在執行的是一個Java方法,計數器記錄的是正在執行的虛擬機季節嗎指令的地址;如果正在執行的是native方法,計數器的值為空(Undefined)。此區域不會出現OutOfMemoryError。 程序計數器是線程私有的。

Java內存區域