JDK8一套通用的JVM参数配置(含排查GC问题可能需要的参数)

  • 前言:

本文内容是基于 JDK 8

  • 背景描述:


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


  • 注意事项


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

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

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


  • JVM参数


设置初始内存和最大内存为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

可选参数

在CMS remark之前做一次ygc

-XX:CMSScavengeBeforeRemark

并行处理Reference

-XX:+ParallelRefProcEnabled

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

-XX:+PrintStringTableStatistics

-XX:+PrintReferenceGC

-XX:+PrintHeapAtGC

-XX:+PrintGCApplicationStoppedTime

-XX:+PrintSafepointStatistics

-XX:PrintSafepointStatisticsCount=1
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java 虚拟机有自己完善的硬件架构, 如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM 屏蔽了与具体操作系...
    尹小凯阅读 5,603评论 0 10
  • 转载blog.csdn.net/ning109314/article/details/10411495/ JVM工...
    forever_smile阅读 10,738评论 1 56
  • JVM架构 当一个程序启动之前,它的class会被类装载器装入方法区(Permanent区),执行引擎读取方法区的...
    cocohaifang阅读 5,636评论 0 7
  • Java和C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进来,墙里面的人想出来。 对象...
    胡二囧阅读 4,813评论 0 4
  • 内存溢出和内存泄漏的区别 内存溢出:out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,...
    Aimerwhy阅读 4,046评论 0 1