加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

JVM产生CMS GC的 5 种环境,你知道的必定不全!

发布时间:2019-06-12 22:35:57 所属栏目:站长百科 来源:涤生YQ
导读:常常有同窗会问,为啥我的应用 Old Gen 的行使占比没到达 CMSInitiatingOccupancyFraction 参数设置的阈值,就触发了 CMS GC,暗示很莫名奇奥,不知道题目出在哪? 着实 CMS GC 的触发前提很是多,不可是 CMSInitiatingOccupancyFraction 阈值触发这么简朴

从源码上看,这里首要分成两类: (a) Old Gen 空间行使占比环境与阈值较量,假如大于阈值则举办 CMS GC 也就是"occupancy() > initiatingoccupancy()",occupancy 毫无疑问是 Old Gen 当前空间的行使占比,而 initiatingoccupancy 是几多呢?

  1. _cmsGen ->init_initiating_occupancy(CMSInitiatingOccupancyFraction, CMSTriggerRatio); 
  2. ... 
  3. void ConcurrentMarkSweepGeneration::init_initiating_occupancy(intx io, uintx tr) { 
  4. assert(io <= 100 && tr <= 100, "Check the arguments"); 
  5. if (io >= 0) { 
  6. _initiating_occupancy = (double)io / 100.0; 
  7. } else { 
  8. _initiating_occupancy = ((100 - MinHeapFreeRatio) + 
  9. (double)(tr * MinHeapFreeRatio) / 100.0) 
  10. / 100.0; 

可以看到当 CMSInitiatingOccupancyFraction 参数设置值大于 0,就是 “io / 100.0”;

当 CMSInitiatingOccupancyFraction 参数设置值小于 0 时(留意,默认是 -1),是 “((100 - MinHeapFreeRatio) + (double)(tr * MinHeapFreeRatio) / 100.0) / 100.0”,这到底是几多呢?是 92%,这里就不贴出详细的计较进程了,或者你已经在某些书可能博客中相识过,CMSInitiatingOccupancyFraction 没有设置,就是 92,可是着实 CMSInitiatingOccupancyFraction 没有设置是 -1,以是阈值取后者 92%,并不是 CMSInitiatingOccupancyFraction 的值是 92。

(b) 接下来没有设置 UseCMSInitiatingOccupancyOnly 的环境

这里也分成有两小类环境:

当 Old Gen 刚由于工具分派空间而举办扩容,且乐成分派空间,这时会思量举办一次 CMS GC;

按照 CMS Gen 空闲链判定,这里有点伟大,今朝也没整清晰,亏得凭证默认设置其拭魅这里返回的是 false,以是默认是不消思量这种触发前提了。

4.按照增量 GC 是否也许会失败(气馁计策)

什么意思呢?两代的 GC 系统中,首要指的是 Young GC 是否会失败。假如 Young GC 已经失败可能也许会失败,JVM 就以为必要举办一次 CMS GC。

  1. bool incremental_collection_will_fail(bool consult_young) { 
  2. // Assumes a 2-generation system; the first disjunct remembers if an 
  3. // incremental collection failed, even when we thought (second disjunct) 
  4. // that it would not. 
  5. assert(heap()->collector_policy()->is_two_generation_policy(), 
  6. "the following definition may not be suitable for an n(>2)-generation system"); 
  7. return incremental_collection_failed() || 
  8. (consult_young && !get_gen(0)->collection_attempt_is_safe()); 

我们看两个判定前提,“incrementalcollectionfailed()” 和 “!getgen(0)->collectionattemptissafe()” incrementalcollectionfailed() 这里指的是 Young GC 已经失败,至于为什么会失败一样平常是由于 Old Gen 没有足够的空间来容纳提拔的工具。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读