一、JVM参数类型
JVM参数类型分为3种:标配参数,X参数,XX参数。
二、标配参数
java
:
-version
,-help
,-client
,-server
,-classpath
, -cp
,-showversion
此类参数无论jdk怎么升级,参数仍然保持不变,相对比较稳定的参数。
三、X参数
非标准化参数,变化较小
-Xin
: 解释执行。
-Xcomp
: 第一次使用就编译成本地代码。
-Xmixed
: 混合模式,JVM自己来决定是否编译成本地代码,默认使用的就是混合模式。
[root@yun-develop-service_01 ycopen]# java -version
java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, mixed mode)
[root@yun-develop-service_01 ycopen]# java -Xint -version
java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, interpreted mode)
[root@yun-develop-service_01 ycopen]# java -Xcomp -version
java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, compiled mode)
四、XX参数
非标准化参数,相对不稳定,主要用于JVM调优和debug。它分为Boolean型和K-V型两种类型。
1)Boolean类型
1、格式
-XX:[+-]<name>
, 其中+-表示启用或禁用name属性。
2、示例
-XX:+UseConcMarkSweepGC
表示启用CMS垃圾收集器。
-XX:+UseG1GC
表示启用G1垃圾收集器。
2)K-V类型
1、格式
-XX:<name>=<value>
表示name属性对应的值是value。
2、示例
-XX:MaxGCPauseMillis=500
表示GC的最大停顿时间是500毫秒。
注意:-Xmx和-Xms表示设置JVM的最大内存和最小内存,它们不是X参数,而是XX参数。
-Xmx
等价于-XX:MaxHeapSize
-Xms
等价于-XX:InitialHeapSize
-Xss
等价于-XX:ThreadStackSize
[root@yun-develop-service_01 ycopen]# jinfo -flag MaxHeapSize 10211
-XX:MaxHeapSize=3221225472
五、常用JVM参数
-Xms
: 初始堆大小,是指设定程序启动时占用内存大小,默认为服务器内存的1/64。大点程序会启动的快一点,但是也可能会导致机器暂时间变慢。
-Xmx
: 最大堆大小,是指设定程序运行期间最大可占用的内存大小,默认为服务器内存的1/4。如果程序运行需要占用更多的内存,超出了这个设置值,就会抛出OutOfMemory异常。
-Xss
: 为jvm启动的每个线程分配的内存大小,是指设定每个线程的堆栈大小,默认为512K-1024K,大小取决于服务器配置,从java8以后,默认都是1024K。这个要依据你的程序,看一个线程大约需要占用多少内存,可能会有多少线程同时运行等。
-Xmn
: 年轻代大小
-MetaspaceSize
: 元空间大小
整个堆大小=年轻代大小 + 年老代大小 + 持久代(JDK1.8以后称为元空间)大小
六、JVM内存配置规范
- 默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。 因此服务器一般设置-Xms和-Xmx相等以避免在每次GC后调整堆的大小。
- 可以利用JVM提供的-Xmn,-Xms,-Xmx等选项进行堆内存设置; 一般将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值,建议堆的最大值可以设置为可用内存的最大值的80%。
- 16G内存的服务器配置为:-Xmx=16G*0.8=12G,-Xms默认和-Xmx大小一样,也为12G。-Xmn为1/4的-Xmx值,为4G。
七、配置示例
- 服务器硬件配置
8核CPU、8G 内存,JDK 1.8.X - 参数配置实例
-server -Xmx3550m -Xms3550m -Xmn1256m -Xss128k -XX:SurvivorRatio=6 -XX:MaxPermSize=256m -XX:ParallelGCThreads=8 -XX:MaxTenuringThreshold=0 -XX:+UseConcMarkSweepGC
- 调优说明
- -Xmx 与 -Xms 相同以避免JVM反复重新申请内存。-Xmx 的大小约等于系统内存大小的一半,即充分利用系统资源,又给予系统安全运行的空间。
- -Xmn1256m 设置年轻代大小为1256MB。此值对系统性能影响较大,Sun官方推荐配置年轻代大小为整个堆的3/8。
- -Xss128k 设置较小的线程栈以支持创建更多的线程,支持海量访问,并提升系统性能。
- -XX:SurvivorRatio=6 设置年轻代中Eden区与Survivor区的比值。系统默认是8,根据经验设置为6,则2个Survivor区与1个Eden区的比值为2:6,一个Survivor区占整个年轻代的1/8。
- -XX:ParallelGCThreads=8 配置并行收集器的线程数,即同时8个线程一起进行垃圾回收。此值一般配置为与CPU数目相等。
- -XX:MaxTenuringThreshold=0 设置垃圾最大年龄(在年轻代的存活次数)。如果设置为0的话,则年轻代对象不经过Survivor区直接进入年老代。对于年老代比较多的应用,可以提高效率;如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。根据被海量访问的动态Web应用之特点,其内存要么被缓存起来以减少直接访问DB,要么被快速回收以支持高并发海量请求,因此其内存对象在年轻代存活多次意义不大,可以直接进入年老代,根据实际应用效果,在这里设置此值为0。
- -XX:+UseConcMarkSweepGC 设置年老代为并发收集。CMS(ConcMarkSweepGC)收集的目标是尽量减少应用的暂停时间,减少Full GC发生的几率,利用和应用程序线程并发的垃圾回收线程来标记清除年老代内存,适用于应用中存在比较多的长生命周期对象的情况。