ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CMS+ParNewGC Young区默认大小值是多少

2022-07-26 16:00:07  阅读:185  来源: 互联网

标签:old young Young XX jvm ParNewGC 大小 CMS


背景:


新业务上线, 使用CMS+ParNew分别作为老年代与新生代GC回收器。 其中JVM部分配置如下:   

-Xms4096m -Xmx4096m -Xss256k -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
上线后通过grafana观察jvm监控, 其中old取与young区堆内存大小分配如下(线上容器没有java用户权限, 故无法使用jvm命令工具查看):

 

 


其中, old取大小为 3.84G , young区大小为 133+16.6*2 = 166.2M, 原预期, 未指定young取大小时, old区与young区大小比例为2:1. 但实际查看数据并非如此。 现状,young区堆内存分配过小,
后续开发中会导致yong区gc频繁,由于younggc频繁, 导致新对象晋升至老年代的几率增大。

分析


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的场景会更多一些。 

改进方法(三选一即可):

  1. -XX:NewSize=1024m和-XX:MaxNewSize=1024m; (指定大小, 数值需根据当前堆内存总大小确定)
  2. -Xmn1024m;(指定大小, 数值需根据当前堆内存总大小确定)
  3. -XX:NewRatio=2 (指定比例)

 

增加参数 -XX:NewRatio=2

 

 

参考


参考资料:https://www.jianshu.com/p/832fc4d4cb53

标签:old,young,Young,XX,jvm,ParNewGC,大小,CMS
来源: https://www.cnblogs.com/yczhang1011/p/16521347.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有