博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM调优——之CMS 常见参数解析
阅读量:6774 次
发布时间:2019-06-26

本文共 2062 字,大约阅读时间需要 6 分钟。

   最近在学习使用CMS这个GC,这里记录下常用的参数。

1. UseCMSCompactAtFullCollection 与 CMSFullGCsBeforeCompaction

     有一点需要注意的是:CMS并发GC不是“full GC”。HotSpot VM里对concurrent collection和full collection有明确的区分。所有带有“FullCollection”字样的VM参数都是跟真正的full GC相关,而跟CMS并发GC无关的。

CMSFullGCsBeforeCompaction这个参数在HotSpot VM里是这样声明的:       

product(bool, UseCMSCompactAtFullCollection, true,                     \        "Use mark sweep compact at full collections")                  \                                                                       \product(uintx, CMSFullGCsBeforeCompaction, 0,                          \        "Number of CMS full collection done before compaction if > 0") \

然后这样使用的:

*should_compact =    UseCMSCompactAtFullCollection &&    ((_full_gcs_since_conc_gc >= CMSFullGCsBeforeCompaction) ||     GCCause::is_user_requested_gc(gch->gc_cause()) ||     gch->incremental_collection_will_fail(true /* consult_young */));

CMS GC要决定是否在full GC时做压缩,会依赖几个条件。其中,
第一种条件,UseCMSCompactAtFullCollection 与 CMSFullGCsBeforeCompaction 是搭配使用的;前者目前默认就是true了,也就是关键在后者上。
第二种条件是用户调用了System.gc(),而且DisableExplicitGC没有开启。
第三种条件是young gen报告接下来如果做增量收集会失败;简单来说也就是young gen预计old gen没有足够空间来容纳下次young GC晋升的对象。
上述三种条件的任意一种成立都会让CMS决定这次做full GC时要做压缩。
CMSFullGCsBeforeCompaction 说的是,在上一次CMS并发GC执行过后,到底还要再执行多少次full GC才会做压缩。默认是0,也就是在默认配置下每次CMS GC顶不住了而要转入full GC的时候都会做压缩。 把CMSFullGCsBeforeCompaction配置为10,就会让上面说的第一个条件变成每隔10次真正的full GC才做一次压缩(而不是每10次CMS并发GC就做一次压缩,目前VM里没有这样的参数)。这会使full GC更少做压缩,也就更容易使CMS的old gen受碎片化问题的困扰。 本来这个参数就是用来配置降低full GC压缩的频率,以期减少某些full GC的暂停时间。CMS回退到full GC时用的算法是mark-sweep-compact,但compaction是可选的,不做的话碎片化会严重些但这次full GC的暂停时间会短些;这是个取舍。

2. -XX:CMSInitiatingOccupancyFraction=70 和-XX:+UseCMSInitiatingOccupancyOnly

    这两个设置一般配合使用,一般用于『降低CMS GC频率或者增加频率、减少GC时长』的需求

   -XX:CMSInitiatingOccupancyFraction=70 是指设定CMS在对内存占用率达到70%的时候开始GC(因为CMS会有浮动垃圾,所以一般都较早启动GC);

   -XX:+UseCMSInitiatingOccupancyOnly 只是用设定的回收阈值(上面指定的70%),如果不指定,JVM仅在第一次使用设定值,后续则自动调整.

3. -XX:+CMSScavengeBeforeRemark

   在CMS GC前启动一次ygc,目的在于减少old gen对ygc gen的引用,降低remark时的开销-----一般CMS的GC耗时 80%都在remark阶段

 

 

转载于:https://www.cnblogs.com/onmyway20xx/p/6605324.html

你可能感兴趣的文章
1.HTML复习(常用的标签,属性,div布局,meta)
查看>>
java最新全套学习视频(java,前端,其他语言)
查看>>
多年心愿,终于完成,热泪盈眶啊。。。Adrew NG 的 机器学习
查看>>
R语言markov switching model马尔可夫转换模型研究商业周期
查看>>
设计模式学习
查看>>
Robot Framework(五)使用测试库
查看>>
Spark2 Model selection and tuning 模型选择与调优
查看>>
使用vs code开发.net core2.2时OmniSharp.MSBuild.ProjectLoader无法解析"xxx"的解决方法
查看>>
iOS之 opencv3.0.framework
查看>>
css 兼容ie8 rgba()用法
查看>>
[转载]如何从 Windows Phone 的罗盘传感器获取数据
查看>>
ASP.NET MVC5 入门
查看>>
动态规划
查看>>
Java enum枚举的使用方法
查看>>
主账号删除后,查询应用时,无法翻页
查看>>
Android 4.4.4: java.lang.SecurityException: Package com.android.settings does not belong to 1001
查看>>
java中生成验证码,以及验证码的使用
查看>>
C#二维码
查看>>
创建包
查看>>
数据查询
查看>>