在啓動java程序時創建jvm,操作系統會給jvm分配內存,這塊內存就是jvm的運行時數據區。
運行時數據區通常包括這幾個部分:程序計數器(Program Counter Register)、Java棧(VM Stack)、本地方法棧(Native Method Stack)、方法區(Method Area)、堆(Heap)
經常配置的內存參數主要有如下幾個:
- Xss:每個線程的stack大小(棧)
- Xmx:JAVA HEAP的最大值、默認爲物理內存的1/4
- Xms:JAVA HEAP的初始值,server端最好Xms與Xmx一樣
- Xmn:JAVA HEAP young區的大小(相當於對-XX:newSize、-XX:MaxnewSize同時設置)
- XX:PermSize:設定內存的永久保存區域(JDK7)
- XX:MaxPermSize:設定最大內存的永久保存區域(JDK7)
在JDK1.8中,取消了PermGen,取而代之的是Metaspace,所以PermSize和MaxPermSize參數失效,取而代之的是元空間:
-XX:MetaspaceSize
-XX:MaxMetaspaceSize
本次通過配置不同的參數,使用jmap觀察參數的變化。
1、試驗準備:
1.1 操作系統:win10, 安裝jdk8
2.2 製作一個可執行的jar包,本試驗使用spring boot開發了一個web應用 demo.jar。
3.3 如果安裝了多個版本的jdk,試驗時請確保使用的是同一個版本
2、通過配置不同的內存參數和大小,使用jmap命令觀察內存變化
2.1 默認內存(啓動不加任何內存參數)
在命令行窗口執行: java -jar demo.jar
新打開命令窗口,執行jmap -heap java進程ID
2.2 設置最大內存 -Xmx
java -Xmx20m -jar demo.jar
2.3 新生代
java -Xmx20m -Xmn5m -jar demo.jar
2.4 元空間大小
java -Xmx20m -Xmn5m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -jar demo.jar