CMS+ParNewGC Young区默认大小值是多少
背景:
新业务上线, 使用CMS+ParNew分别作为老年代与新生代GC回收器。 其中JVM部分配置如下:
-Xms4096m -Xmx4096m -Xss256k -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
上线后通过grafana观察jvm监控, 其中old取与young区堆内存大小分配如下(线上容器没有java用户权限, 故无法使用jvm命令工具查看):
分析
1. CMS+ParNew回收器下, 不单独指定young区大小:
1. 使用类似jvm启动参数, 在测试环境复现此过程。 jvm部分配置如下:
"-XX:+UseParNewGC", "-XX:+UseConcMarkSweepGC", "-Xms512m","-Xmx512m", "-Xss256k"
查看jvm启动时生效参数 young区堆内存default值约为 83M, old区大小约为429M。 比例依然不为2:1
2. 使用jdk1.8 默认GC回收器 parallel + parallelOld
查看下图中, 老年代与新生代大小默认值为 350M:170M , 大小约为 2:1
原因
查询相关资料得知: ParNewgc回收器young区默认堆内存大小为:
机器位数 * cpu核数 * 13 / 10
与运维同学确认线上容器配置为 2核 6G 64位
使用上述公式, 计算线上服务young区堆内存大小: 64*2*13/10= 166.4, 此值与当先线上数值大致相等。
总结
经上述论证得知, 当使用jdk1.8默认GC回收器时, 可不指定young区与old区大小配置。
parallelGCh回收器 默认堆old区与young区内存大小比例 2:1
CMS+ParNew使用时, 需显示指定young区大小, 或指定old区与young区大小比例
我们知道parallel回收器, 注重的是服务吞吐量, CMS注重的是用户线程暂停时间。 作为面向c端用户的我们, 使用CMS+ParNew的场景会更多一些。
改进方法(三选一即可):
- -XX:NewSize=1024m和-XX:MaxNewSize=1024m; (指定大小, 数值需根据当前堆内存总大小确定)
- -Xmn1024m;(指定大小, 数值需根据当前堆内存总大小确定)
- -XX:NewRatio=2 (指定比例)
增加参数 -XX:NewRatio=2
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)