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数。并行收集线程数
怎么选择垃圾收集器
- 优先调整堆的大小让服务器自己来选择
- 如果内存小于100m,使用串行收集器
- 如果是单核,并且没有停顿时间的要求,串行或JVM自己选择
- 如果允许停顿时间超过1秒,选择并行或者JVM自己选
- 如果响应时间最重要,并且不能超过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
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
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
参数 | 含义 |
---|---|
-XX:G1HeapRegionSize=n | 设置Region大小,并非最终值 |
-XX:MaxGCPauseMillis | 设置G1收集过程目标时间,默认值200ms,不是硬性条件 |
-XX:G1NewSizePercent | 新生代最小值,默认值5% |
-XX:G1MaxNewSizePercent | 新生代最大值,默认值60% |
-XX:ParallelGCThreads | STW期间,并行GC线程数 |
-XX:ConcGCThreads=n | 并发标记阶段,并行执行的线程数 |
-XX:InitiatingHeapOccupancyPercent | 设置触发标记周期的 Java 堆占用率阈值。默认值是45%。 |