基于JDK8 配置通用的JVM参数

  • Post author:
  • Post category:其他


  • 背景描述:

因发现公司的JVM参数配置的不合理,项目JVM参数配置不统一,并且CMS GC触发时间,是交由JVM动态调控的,造成遇到GC和JVM相关问题的时候,排查较为困难,于是基于JDK8整理出一套通用的JVM参数配置。

  • 新生代垃圾回收器是采用ParNew(标记复制算法)

  • 老年代的垃圾回收器是采用CMS(标记清除算法)

  • 备用老年代垃圾回收器(Concurrent Mode Failure)采用Serial Old(标记整理算法)


1.通用参数:

设置初始内存和最大内存为5120m(具体大小可根据项目自行调节),设置为统一,避免扩容造成的性能损失

-Xms5120m 

-Xmx5120m

设置新生代大小为1706m 推荐新生代大小:老年代大小比例为 1:2,新生代占整堆大小的1/3

-Xmn1706m

设置线程栈为512k

-Xss512k

设置元空间初始内存和最大内存为512m

-XX:MaxMetaspaceSize=512m 
-XX:MetaspaceSize=512m

指定CMS垃圾回收器作为老年代回收器

-XX:+UseConcMarkSweepGC

使用Parnew垃圾回收器作为新生代回收器

-XX:+UseParNewGC

关闭JVM自动调控的垃圾回收,不开启此参数,后续很多配置参数无意义

-XX:+UseCMSInitiatingOccupancyOnly

// FullGC之后开启压缩,配套使用CMSFullGCsBeforeCompaction的值作为FullGC几次之后 压缩一次,值为0的话就默认每次FullGC压缩一次,注意CMS GC不是Full GC,可自行百度CMS 的 foreground GC和 background GC的区别)

-XX:+UseCMSCompactAtFullCollection

-XX:CMSFullGCsBeforeCompaction=0

在老年代内存达到70%的时候,进行CMS垃圾回收

-XX:CMSInitiatingOccupancyFraction=70

CMS垃圾回收时卸载无用的class类

-XX:+CMSClassUnloadingEnabled

在做System.gc()时会做background模式CMS GC。主要因为用NIO/Netty框架的时候,会直接申请堆外内存,很多框架底层,为了释放mmap分配的空间,会调用System.gc()来回收

-XX:+ExplicitGCInvokesConcurrent

以下为打印GC日志和OOM时dump的参数

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=xxxx/heapdump.hprof

-XX:+PrintGC

-XX:+PrintGCDateStamps

-XX:+PrintGCDetails

-XX:+PrintGCTimeStamps

2.排查GC问题可选参数

在CMS remark之前做一次ygc

-XX:CMSScavengeBeforeRemark

并行处理Reference

-XX:+ParallelRefProcEnabled

排查GC时间过长的可选参数

-XX:+PrintStringTableStatistics

-XX:+PrintReferenceGC

-XX:+PrintHeapAtGC

-XX:+PrintGCApplicationStoppedTime

-XX:+PrintSafepointStatistics

-XX:PrintSafepointStatisticsCount=1


链接:http://events.jianshu.io/p/df8b7d64421e



版权声明:本文为qq_22074333原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。