跳到主要内容

08、JVM 调优实战 - 线上部署时如何设置JVM内存大小

1. JVM内存相关的几个核心参数

在JVM 内存分配中,有以下几个参数比较核心:

1、 -Xms:Java堆内存的大小;
2、 -Xmx:Java堆内存的最大大小;
3、 -Xmn:Java堆内存中的新生代大小,扣除新生代剩下的就是老年代的内存大小了;
4、 -XX:PermSize:永久代大小;
5、 -XX:MaxPermSize:永久代最大大小;
6、 -Xss:每个线程的栈内存大小;

参数说明:

-Xms 和 -Xmx,分别用于设置 Java 堆内存的初始值大小,以及最大能扩展的内存大小。建议设置为一样的大小,减少内存提升的性能消耗。

总得来说,上面两个参数,是用来限定 Java堆内存的总大小,如下图:

 

-Xmn,该参数用于设置Java堆内存的新生代的大小,然后扣除新生代大小之后的剩余内存就是给老年代的内存大小。

 

-XX:PermSize-XX:MaxPermSize,分别限定了永久代大小和永久代的最大大小。通常这两个数值也是设置为一样的。

JDK1.8以后的版本,这两个参数被替换为了 -XX:MetaspaceSize-XX:MaxMetaspaceSize

 

-Xss,该参数限定了每个线程的栈内存大小。

每个线程都有一个自己的虚拟机栈,然后每次执行一个方法,就会将方法的栈帧压入线程的栈里,方法执行完毕,那么栈帧就会从线程的栈里出栈,如下图:

 

2. 如何在启动系统的时候设置 JVM参数

如果是在 Ecplise/IntelliJ IDEA开发工具里启动一个程序,然后设置 JVM参数,按照下面的步骤来设置:

 

首先该程序要有写好的带 main() 方法的类,然后在程序右键选择 “Debug as” 选项,选择 “Debug Configuration” 选项,看到如上面的面板。

在该面板的 “Arguments” 的菜单页面,点击选择。然后在 “VM Arguments” 中输入 JVM 参数即可。

设置参数的方式为,在比如 -Xms之类的参数后面跟上你要设置的内存大小,多少M即可。但是 -XX:PermSize这种格式的参数,需要跟一个 “=” 符合,跟上要设置的内存大小即可。

 

如果是在线上部署系统应该如何设置 JVM参数?

比如采用 “java -jar” 的方式启动一个 jar 包里的系统,然后采用类似下面的格式:

java -Xms512M -Xmx512M -Xmn256M -Xss1M -XX:PermSize=128M -XX:MaxPermSize=128M -jar App.jar