CMS垃圾回收器的堆内存分配问题

JDK8中年轻代与老年代比例

背过八股文的都知道,JDK8中堆内存中年轻代与老年代比例是1比2。

这个比例有个前提条件,就是之前的文章写的JDK8中默认的垃圾回收器,在默认情况下是这个比例没错,但是如果项目中使用CMS代替默认的GC回收器呢,这个比例还正确么?

踩坑记录

项目中某个服务容器配置内存是4G,通过-XX:InitialRAMPercentage=75 控制JVM内存控制为容器的75%,大概2.5G左右不到。

随着业务量的增长,单服务节点的高峰QPS不算攀高,发现高峰期极易发生FullGC。

于是用Arthas工具做了heapDump然后分析,不分析不知道,一分析发现堆内存总共大小2424M,但是JVM中年轻代大小只有332.75MB,这个比例与八股中的1:2相差深远。难怪一到高峰就疯狂FullGC,这下总算找到了出处。

CMS垃圾回收器的特别之处

使用CMS收集器会导致默认的newRatio配置不生效

CMS中堆内存分配方式根据相关计算公式,如果机器CPU为4核,则年轻代 =  64M * 4 * 13 / 10 = 332.8M。

你可能感兴趣的:(JVM,java,jvm,算法)