CMS垃圾回收分析及优化

总体垃圾回收器搭配使用如下CMS垃圾回收分析及优化_第1张图片

我们项目中常见搭配是年轻代采用ParNew老年代 CMS+Serial Old其分代收集实现如下

CMS垃圾回收分析及优化_第2张图片

minor gc为ParNew垃圾收集器为多线程收集器

major gc 为CMS垃圾收集器多线程最低停顿垃圾收集器

full gc 为serial 垃圾收集器为单线程垃圾收集器

Serial是jvm中fgc的默认行为

 

jvm采用CMS合理配置

//设置最小堆空间和最大堆空间大小

-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

 

 

你可能感兴趣的:(虚拟机学习)