我们项目中常见搭配是年轻代采用ParNew老年代 CMS+Serial Old其分代收集实现如下
minor gc为ParNew垃圾收集器为多线程收集器
major gc 为CMS垃圾收集器多线程最低停顿垃圾收集器
full gc 为serial 垃圾收集器为单线程垃圾收集器
Serial是jvm中fgc的默认行为
//设置最小堆空间和最大堆空间大小
-Xms14g -Xmx14g
//设置每个线程最多可用空间
-Xss512k
-XX:MetaspaceSize=384m -XX:MaxMetaspaceSize=384m
//这里设置年轻代的最大空间和最小空间如果Xms和Xmx相同可以用(-Xmn11g)替换下面
-XX:NewSize=11g -XX:MaxNewSize=11g (推荐用-Xmn11g)
//设置survivor和eden比例 (survivor大小为年轻代大小*(2+survivorRatio)
-XX:SurvivorRatio=18
//设置最大直接内存的大小
-XX:MaxDirectMemorySize=2g
//年轻代使用ParNewGC
-XX:+UseParNewGC
//并发收集垃圾时启动线程数量为4个
-XX:ParallelGCThreads=4
//年轻代需要经过15次提升才能进入到老年代
-XX:MaxTenuringThreshold=15
//使用老年代使用CMS+Serial Older 组合垃圾回收器
-XX:+UseConcMarkSweepGC
//取消System.gc()
-XX:+DisableExplicitGC (这里和下面参数无法共同存在)
//是指设定CMS在对内存占用率达到70%的时候开始GC(因为CMS会有浮动垃圾,所以一般都较早启动GC)并且一直使用这个比例;
-XX:CMSInitiatingOccupancyFraction=70
-XX:+UseCMSInitiatingOccupancyOnly
//cms执行remark进行一次minor gc并开启并行进行remark
-XX:+CMSScavengeBeforeRemark
//开启再次标记时采用多线程进行
-XX:+CMSParallelRemarkEnabled
//在FullGC时是否进行内存压缩默认开启,并且设置多少次cms gc后进行一次内存压缩
-XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction=9
//配置在full gc 开始之前进行minor gc(也就是执行yong gc)
-XX:+ScavengeBeforeFullGC
//配置让cms能够进行类卸载能力
-XX:+CMSClassUnloadingEnabled
//配置让cms能够回收元空间能力
-XX:+CMSPermGenSweepingEnabled
-XX:SoftRefLRUPolicyMSPerMB=0
-XX:-ReduceInitialCardMarks
//配置让cms能够有回收堆外内存能力
-XX:+ExplicitGCInvokesConcurrent (将System.gc()采用cms进行回收而不是full gc)
//配置输出日志详细信息并指定文件件
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCApplicationConcurrentTime
-XX:+PrintHeapAtGC
-Xloggc:/data/applogs/heap_trace.log
//配置堆内存溢出输出当前快照位置
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/data/dump/error.hprof