1. JVM内存相关的几个核心参数
在 JVM 内存分配中,有以下几个参数比较核心:
- -Xms: Java堆内存的大小
- -Xmx:Java堆内存的最大大小
- -Xmn:Java堆内存中的新生代大小,扣除新生代剩下的就是老年代的内存大小了
- -XX:PermSize:永久代大小
- -XX:MaxPermSize:永久代最大大小
- -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