【Java進階知識】Java虛擬機中的內存區域

Java虛擬機在執行Java程序時,會將Java內存分爲多個區域,它們各自有不同的存儲數據以及作用,接下來就將介紹Java虛擬機中內存的分佈情況。

1.程序計數器

程序計數器是一塊較小的內存,可以看作是當前線程所執行行號指示器。字節碼指示器的作用就是指示下一條需要執行的字節碼的指令。分支、循環、跳轉、異常處理、線程恢復等都需要依賴這個計數器來完成。
由於Java多線程時通過線程輪流切換,並分配執行時間的方式來實現的,在任何時間,一個CPU只能執行一個線程,因此當線程結束後需要恢復到正常位置時,就需要使用程序計數器,因此每一個線程都有一個獨立的程序計數器我們稱這類內存區域爲線程私有內存區域。

2. Java虛擬機棧

同程序計數器一樣,Java虛擬機棧也是線程私有的,它的生命週期與線程相同。事實上,我們常說的棧就指的是虛擬機棧,也是Java方法執行的內存模型。在每個方法執行時,都會創建一個棧幀它主要用於存儲局部變量、操作數棧、動態鏈接、方法出口等信息。每一個方法從調用開始到結束都對應棧幀入棧出棧的操作。

這裏我們重點關注局部變量表部分:局部變量表存放了編譯期間可知各種基本數據類型和引用數據類型。局部變量表所需要的內存在編譯期間就完成分配,當進入一個方法時,需要分配多大的內存是完全確定的,在方法執行時不可更改。

3.本地方法棧

本地方法棧也是棧,它與虛擬機棧作用相似,唯一的不同就是虛擬機棧爲執行Java方法服務,而本地方法棧則爲虛擬機使用的Native方法進行服務。

4.堆區

Java堆區也是Java虛擬機中管理的最大的一份內存,是被線程共享的一塊區域,在虛擬機啓動時就創建出來。其最大的作用就是存放對象實例,幾乎所有的對象實例都在堆中分配空間。Java堆也是垃圾回收器主要管理的區域,因此也稱爲”GC堆“

5.方法區

方法區同Java堆一樣是被線程共享的一塊區域。它主要存儲已被虛擬機加載過的類信息、常量、靜態變量等數據。
在JDK1.7的虛擬機中已經將原本放在方法區的字符串常量池移到堆中

6.運行時常量池

運行時常量池時方法區的一部分,常量池用於存儲編譯期生成的各種字面量和符號引用這部分內容將在類加載後進入方法區的運行時常量池釋放。一般情況下不僅會保存類中描述的符號引用,還會把翻譯出來的直接引用也存儲在運行時常量池中。
其中:
字面量——final常量、基本數據類型的值
符號引用——類和結構的完全限定名、字段的名稱和描述符、方法的名稱和描述符
運行時常量池相比於Class文件常量池的另一個特性時具備動態性,Java語言中並沒有要求常量一定在編譯期間產生,因此運行期間也可能將行的常量放在池中,例如String類的intern()方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章