Skip to content

JVM调优

基本常用设置参数

堆设置的常用参数

  • -Xms :初始堆大小
  • -Xmx :最大堆大小,当Xms和Xmx设置相同时,堆就无法进行自动扩展
  • -XX:NewSize=n/-Xmn :设置年轻代大小
  • -XX:NewRatio=n: 设置年轻代和年老代的比值。如:为 3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
  • -XX:SurvivorRatio=n :年轻代中Eden区与Survivor区的比值。注意Survivor区有两个。如:XX:SurvivorRatio=3,表示Eden区的大小是一个Survivor区的三倍,但Survivor区有两个,那么Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5。
  • -XX:MaxPermSize/-XX:MetaspaceSize=n :设置方法区大小

收集器设置

  • -XX:+UseSerialGC :设置串行收集器(serial+serialOld)
  • -XX:+UseParallelGC :设置并行收集器(Parnew+Serialold)
  • -XX:+UseParalledlOldGC :设置并行年老代收集器(parScavenge+parold)
  • -XX:+UseConcMarkSweepGC :设置并发收集器(Parnew+Cms)

垃圾回收统计信息

  • -XX:+PrintHeapAtGC GC的heap详情
  • -XX:+PrintGCDetails GC详情
  • -XX:+PrintGCTimeStamps 打印GC时间信息
  • -XX:+PrintTenuringDistribution 打印年龄信息等
  • -XX:+HandlePromotionFailure 老年代分配担保(true or false)

并行收集器设置

  • -XX:ParallelGCThreads=n :设置并行收集器收集时使用的CPU数。并行收集线程数。
  • -XX:MaxGCPauseMillis=n :设置并行收集最大暂停时间
  • -XX:GCTimeRatio=n :设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)

并发收集器设置

  • -XX:+CMSIncrementalMode :设置为增量模式。适用于单CPU情况。
  • -XX:ParallelGCThreads=n :设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数

怎么选择垃圾收集器

  1. 优先调整堆的大小让服务器自己来选择
  2. 如果内存小于100m,使用串行收集器
  3. 如果是单核,并且没有停顿时间的要求,串行或JVM自己选择
  4. 如果允许停顿时间超过1秒,选择并行或者JVM自己选
  5. 如果响应时间最重要,并且不能超过1秒,使用并发收集器

CPU单核,那么毫⽆疑问Serial 垃圾收集器是你唯⼀的选择。

CPU多核,关注吞吐量 ,那么选择PS+PO组合。

CPU多核,关注⽤户停顿时间,JDK版本1.6或者1.7,那么选择CMS。

CPU多核,关注⽤户停顿时间,JDK1.8及以上,JVM可⽤内存6G以上,那么选择G1。

示例

常用配置

启动应用程序

shell
java -jar -Xloggc:./gc-%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCCause -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M xxx.jar
java -jar -Xloggc:./gc-%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCCause -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M xxx.jar
cms
shell
-Xloggc:d:/gc-cms-%t.log 
-Xms50M -Xmx50M 
-XX:MetaspaceSize=256M 
-XX:MaxMetaspaceSize=256M 
-XX:+PrintGCDetails 
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps 
-XX:+PrintGCCause 
-XX:+UseGCLogFileRotation 
-XX:NumberOfGCLogFiles=10 
-XX:GCLogFileSize=100M
-XX:+UseParNewGC 
-XX:+UseConcMarkSweepGC
-Xloggc:d:/gc-cms-%t.log 
-Xms50M -Xmx50M 
-XX:MetaspaceSize=256M 
-XX:MaxMetaspaceSize=256M 
-XX:+PrintGCDetails 
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps 
-XX:+PrintGCCause 
-XX:+UseGCLogFileRotation 
-XX:NumberOfGCLogFiles=10 
-XX:GCLogFileSize=100M
-XX:+UseParNewGC 
-XX:+UseConcMarkSweepGC
G1
shell
-Xloggc:d:/gc-g1-%t.log 
-Xms512M -Xmx512M 
-XX:MetaspaceSize=256M 
-XX:MaxMetaspaceSize=256M 
-XX:+PrintGCDetails 
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps 
-XX:+PrintGCCause 
-XX:+UseGCLogFileRotation 
-XX:NumberOfGCLogFiles=10 
-XX:GCLogFileSize=100M
-XX:+UseG1GC
-Xloggc:d:/gc-g1-%t.log 
-Xms512M -Xmx512M 
-XX:MetaspaceSize=256M 
-XX:MaxMetaspaceSize=256M 
-XX:+PrintGCDetails 
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps 
-XX:+PrintGCCause 
-XX:+UseGCLogFileRotation 
-XX:NumberOfGCLogFiles=10 
-XX:GCLogFileSize=100M
-XX:+UseG1GC
参数含义
-XX:G1HeapRegionSize=n设置Region大小,并非最终值
-XX:MaxGCPauseMillis设置G1收集过程目标时间,默认值200ms,不是硬性条件
-XX:G1NewSizePercent新生代最小值,默认值5%
-XX:G1MaxNewSizePercent新生代最大值,默认值60%
-XX:ParallelGCThreadsSTW期间,并行GC线程数
-XX:ConcGCThreads=n并发标记阶段,并行执行的线程数
-XX:InitiatingHeapOccupancyPercent设置触发标记周期的 Java 堆占用率阈值。默认值是45%。

参考文档