首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >极长的GC时间

极长的GC时间
EN

Stack Overflow用户
提问于 2012-12-12 10:17:18
回答 5查看 1.4K关注 0票数 3

我们使用以下启动参数运行JBoss,但遇到GC时间过长(>5分钟)的问题。

代码语言:javascript
运行
复制
-Xms116042m -Xmx116042m -XX:PermSize=256M -XX:MaxPermSize=256M -XX:+UseConcMarkSweepGC -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:MaxHeapFreeRatio=95 

对于如何最小化GC时间,有什么建议吗?

注意:这些是16个四核cpu,128 16的linux机器。

GC日志:

我在GC日志中看到许多"CMSbailing out to foreground collection"消息:

代码语言:javascript
运行
复制
130904.206: [GC 130904.206: [ParNew: 240819K->25522K(249216K), 0.2391170 secs] 80798776K->80588205K(118799360K), 0.2395380 secs] [Times: user=2.56 sys=0.01, real=0.24 secs] 
130904.799: [GC 130904.799: [ParNew: 247018K->27648K(249216K), 0.2071170 secs] 80809700K->80601600K(118799360K), 0.2075260 secs] [Times: user=2.61 sys=0.00, real=0.21 secs] 
130905.455: [GC 130905.455: [ParNew: 249216K->27648K(249216K), 0.2808950 secs] 80823168K->80644147K(118799360K), 0.2813140 secs] [Times: user=2.66 sys=0.00, real=0.28 secs] 
130905.765: [Full GC (System) 130905.765: [**CMSbailing out to foreground collection**
131167.602: [CMS-concurrent-mark: 284.753/303.276 secs] [Times: user=909.49 sys=193.05, real=303.23 secs] 
 (concurrent mode interrupted): 80616499K->74658646K(118550144K), 554.7507700 secs] 80651365K->74658646K(118799360K), [CMS Perm : 112620K->112582K(262144K)], 554.7511550 secs] [Times: user=784.15 sys=175.10, real=554.65 secs] 
131461.127: [GC 131461.128: [ParNew: 221568K->27648K(249216K), 0.2620780 secs] 74880214K->74691531K(118799360K), 0.2624960 secs] [Times: user=2.28 sys=0.00, real=0.27 secs] 
131461.698: [GC 131461.699: [ParNew: 249216K->27647K(249216K), 0.3827130 secs] 74913099K->74807895K(118799360K), 0.3829550 secs] [Times: user=3.52 sys=0.41, real=0.39 secs] 
131462.754: [GC 131462.754: [ParNew: 249215K->27648K(249216K), 0.3022410 secs] 75029463K->74827673K(118799360K), 0.3026050 secs] [Times: user=2.36 sys=0.02, real=0.30 secs] 
131463.789: [GC 131463.790: [ParNew: 249216K->22291K(249216K), 0.2396390 secs] 75049241K->74841234K(118799360K), 0.2400980 secs] [Times: user=2.38 sys=0.06, real=0.24 secs] 
EN

回答 5

Stack Overflow用户

发布于 2012-12-12 12:39:46

清理116 Gb的垃圾总是要花很多时间,不管你是使用conc mark,还是并行gc。我总是发现this document是调优GC最有用的信息源。GC调优将特定于您的应用程序需求,并且没有通用的解决方案,但有许多可用的选项。

你可能会更幸运地使用G1GC,因为它将堆分成许多小部分,并独立地清理它们,但它仍然可能受到随机OOME的影响。

如果调优GC不能产生足够的响应时间,请将机器拆分为几个具有16到32 Gb RAM的虚拟机,并将其集群化。如果它是一个EJB应用程序,并且您正确地烘焙了您的豆子,那么它可能并不像看起来那么痛苦。

票数 1
EN

Stack Overflow用户

发布于 2012-12-12 12:00:31

我观察到发生完全GC的一个原因是,您的年轻一代比所需的更早被填满,这需要将对象复制到老一代。因此,我们可以尝试以下选项

  1. 为年轻一代设置初始大小,如下所示:作为老一代–XX:NewRatio=3

的一个因素,

  1. 可以为年轻一代设置-XX:NewSize=500m

希望这能帮到你。

票数 0
EN

Stack Overflow用户

发布于 2012-12-12 17:33:58

您可以将初始堆设置为较小的值。通过这样做,可以减少启动时间。因为java不想在启动时分配非常大的堆。这将为GC节省一些时间,因为它通常会在相对较小的堆上运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13831750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档