尽管使用UseCMSInitiatingOccupancyOnly标志并且导致并发模式失败,CMS-initial-mark仍在增加

时间:2017-09-07 18:13:03

标签: java performance garbage-collection concurrent-mark-sweep

CMS-initial-mark从60%(预期值)开始并持续增长,尽管使用:-XX:+ UseCMSInitiatingOccupancyOnly和-XX:CMSInitiatingOccupancyFraction = 60

我可以请求帮助,为什么它会增加?

标志:

-Xms28g -Xmx28g -XX:PermSize = 512m -XX:MaxPermSize = 512m -Xss512k -XX:NewSize = 8g -XX:MaxNewSize = 8g -XX:SurvivorRatio = 6 -XX:+ AlwaysPreTouch -verbose:gc -XX :+ PrintGCDetails -XX:+ PrintGCTimeStamps -XX:+ UseConcMarkSweepGC -XX:+ UseParNewGC -XX:+ CMSConcurrentMTEnabled -XX:+ CMSScavengeBeforeRemark -XX:CMSWaitDuration = 3600000 -XX:+ ExplicitGCInvokesConcurrent -XX:CMSScheduleRemarkEdenPenetration = 10 -XX:CMSMaxAbortablePrecleanTime = 5000 -XX:CMSInitiatingOccupancyFraction = 60 -XX:+ UseCMSInitiatingOccupancyOnly

GC日志:

08 / 25-18:00:48 [4]< 48574> 145285.817:[CMS-concurrent-abortable-preclean-start]

08 / 25-18:00:51 [4]< 48574> 145286.877:[ GC(分配失败) 145286.877:[ParNew(促销失败):6332558K-> 6339431K(7340032K),1.7870705秒] 145288.664:[CMS145288.749:[CMS-concurrent-abortable- preclean:1.138 / 2.932 secs] [次:用户= 7.11 sys = 0.04,真实= 2.93秒]

08 / 25-18:02:14 [4]< 48574> (并发模式失败):20937785K-> 20947677K(20971520K),82.4977633秒] 27269752K-> 20947677K(28311552K),[Metaspace:108472K-> 108472K(1148928K)],84.2851262 secs] [时间:用户= 84.51 sys = 0.01,实际= 84.29秒]

oldGen历史:

08 / 25-18:00:34 [4]< 48574> 145271.408:[GC(CMS初始标记)[1 CMS-initial-mark:20933339K(20971520K)] 21000667K(28311552K),0.0057867 secs] [次:用户= 0.04 sys = 0.00,real = 0.01 secs]

08 / 25-18:02:31 [4]< 48574> 145388.639:[GC(CMS初始标记)[1 CMS-initial-mark:20947677K(20971520K)] 21005038K(28311552K),0.0044022 secs] [次:用户= 0.03 sys = 0.00,real = 0.01 secs]

1 个答案:

答案 0 :(得分:0)

  

(并发模式失败):20937785K-> 20947677K(20971520K),82.4977633秒] 27269752K-> 20947677K(28311552K)

你有28GiB的整体堆,8GiB是新一代,为老一代留下了20GiB。 在并发模式失败(基本上是一个完整的GC)之后,您在堆上的位置略小于20GiB。这意味着如果所有内容都得到提升,活动对象集只会在旧代中留下少于1GB的备用容量。

要么你的堆太小 - 或年轻一代超大 - 你的工作量要满足你的IHOP所需的40%呼吸空间,否则你的应用程序正在泄漏。