一、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:最大直接內存