在启动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应用 。
3.3 如果安装了多个版本的jdk,试验时请确保使用的是同一个版本
2、通过配置不同的内存参数和大小,使用jmap命令观察内存变化
2.1 默认内存(启动不加任何内存参数)
在命令行窗口执行: java -jar
新打开命令窗口,执行jmap -heap java进程ID
2.2 设置最大内存 -Xmx
java -Xmx20m -jar
2.3 新生代
java -Xmx20m -Xmn5m -jar
2.4 元空间大小
java -Xmx20m -Xmn5m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -jar