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:+UseConcMarkSwee pGC -XX:+UseParNewGC -XX:+CMSConcurrentMTEnabled -XX:+CMSScavengeBeforeRemark -XX:CMSWaitDuration=3600000 -XX:+ExplicitGCInvokesConcurrent -XX:CMSScheduleRemarkEdenPenetration=10 -XX:CMSMaxAbortablePrecleanTime=5000 -XX:CMSInitiatingOccupancyFraction=60 -XX:+Use CMSInitiatingOccupancyOnly
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 秒]14528 8.664: [CMS145288.749: [CMS-concurrent-abortable-preclean: 1.138/2.932 秒] [时间: user=7.11 sys=0.04, real=2.93 秒]
08/25-18:02:14 [4] <48574> (并发模式故障):20937785K->20947677K(20971520K),82.4977633 秒] 27269752K->20947677K(28311552K),[元空间:108472K->108472K(1148928K)],84.2851262秒][时间:user=84.51 sys=0.01,real=84.29秒]
老一代历史:
08/25-18:00:34 [4] <48574> 145271.408:[GC(CMS 初始标记)[1 CMS 初始标记:20933339K(20971520K)] 21000667K(28311552K),0.0057867 秒] [次数:用户=0。 04 系统=0.00,实际=0.01 秒]
08/25-18:02:31 [4] <48574> 145388.639:[GC(CMS 初始标记)[1 CMS 初始标记:20947677K(20971520K)] 21005038K(28311552K),0.0044022 秒] [次数:用户=0。 03 sys=0.00,real=0.01 秒]
最佳答案
(concurrent mode failure): 20937785K->20947677K(20971520K), 82.4977633 secs] 27269752K->20947677K(28311552K)
您有 28GiB 的总堆,其中 8GiB 是新生代,剩下 20GiB 留给老一代。 并发模式失败(本质上是完整 GC)后,堆上只剩下略小于 20GiB 的空间。这意味着,如果一切都得到提升,则 Activity 对象集在老年代中仅留下不到 1GB 的空闲容量。
要么您的堆尺寸过小,要么新生代尺寸过大,以至于您的工作负载无法满足 IHOP 所需的 40% 喘息空间,或者您的应用程序正在泄漏。
关于java - 尽管有 UseCMSInitiatingOccupancyOnly 标志,CMS-initial-mark 仍在增加,并导致并发模式失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46102707/