Java虛擬機學習-(2)內存區域

一、JVM內存佈局

 

1.虛擬機棧

棧裏存放的內調數據,叫棧幀
每個棧幀都包含四個區域:局部變量表、操作數棧、動態連接、返回地址
 
局部變量表:方法參數、方法內部定義的局部變量。
操作數棧:運行時操作碼操作的的操作數。
動態連接:Class文件的常量池中有大量符號引用,字節碼中的方法調用指令就以常量池中指向方法的符號引用爲參數。有些符號引用在運行期間轉化爲直接引用,這部分叫動態連接。
返回地址:方法被調用的位置,其中方法退出分兩種,正常完成出口、異常完成出口。
 
           
這裏的執行包含兩個棧,一個是虛擬機棧,一個是操作數棧。
虛擬機棧的棧幀對應着某個方法,操作數棧的操作數則體現方法的執行。
其中,虛擬機棧中的棧幀,有個返回地址,直接返回指令的內存地址指針,類似於opcode操作碼;而操作數棧存放的操作數。
 

2.程序計數器

當前線程所執行的字節碼的行號,當前線程的執行進度。
 
javap可以輸出代碼的字節碼指令。
 

3.堆

程序中大多數對象存儲在堆,程序啓動就會申請內存。
 
基本數據類型:在虛擬機棧分配內存。
 
普通類型對象:在堆分配內存,虛擬機棧存引用。
 

4.元空間

類的信息、常量池、方法數據、方法代碼。
 
java7 是存儲在Perm區, 是在堆空間的。 java8是存儲在元空間的。方法區的概念依然存在,是在元空間。
 
字符串常量,是在堆中,常量池存放引用。
 

5.直接內存

不是JVM運行時數據區域,也不是JVM規範定義的內存區域。不受Java堆內存設置影響。常見的有Buffer的I/O緩衝區。
 
 

二、各區域參數設置

1.虛擬機棧與本地方法棧

-Xss:設置單個棧容量
 

2.堆

-Xms:堆最小內存

-Xmx:堆最大內存

-XX:+HeapDumpOnOutOfMenoryError:堆內存溢出時Dump出內存快照

3.元空間(永久代)

-XX:MaxMetaspaceSize:元空間最大內存(jdk1.8)

-XX:PermSize:永久代最小內存(jdk1.7)

-XX:MaxPermSize:永久代最大內存(jdk1.7)

4.本機直接內存

-XX:MaxDirectMemorySize:最大直接內存

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