我有一个应用程序,导致创建大量的垃圾。首先(几乎是一个)标准是低GC暂停时间。我使用visualgc工具(和gc日志)尝试不同的GC参数。最佳参数如下。Java CMS GC行为
-XX:+ UseConcMarkSweepGC
-Xmx1172M
-Xms600M
-XX:+ UseParNewGC
-XX:新尺寸= 150M
我的申请使用Java 1.6.0_21在SunOS 10上运行。硬件是2个CPU四核(uname -X结果是numCPU = 8)。
问题是
观察GC行为,新创建的对象上伊甸园空间,直到伊甸园已满。当伊甸园空间完整的GC运行时,清除垃圾,如果对象没有死亡复制到旧版本(我'丢弃'从'&'到'空格),类似的旧版本已满,GC运行CMS并发阶段并清除旧的-gen空间。 CMS的某些部分是停止世界(暂停时间)。这是一个循环。
- 以上scenerio是真的吗?
- GC清理旧版空间后,没有足够的空间扩展旧版空间(XMS和XMS值不同)?
- 完整的GC操作何时开始?如何决定?
- CMS并发阶段持续时间取决于伊甸园空间大小,实际上我的预期是,伊甸园空间不影响CMS并发阶段持续时间。与CMS-并发阶段上的eden空间相关的GC发生了什么?
- 还有什么建议我最大限度地减少暂停时间?事实上,我觉得最有价值的答案:)
感谢
经过20个小时,gc记录了大约5倍的完整gc运行,我猜想一些线索为什么运行Full GC是“升级失败”和“并发模式失败”。在google上搜索这些原因。稍后,为“促销失败”增加旧一代大小,并为“并发模式失败”设置最小值XX:CMSInitiatingOccupancyFraction。我会尝试设置XX:CMSInitiatingOccupancyFraction小值(如30或60)并增加堆。我会分享测试结果。 – 2011-03-17 09:59:23
促销失败通常是我提到的碎片问题,它强制一个非并发的完整gc。你需要检查你的持续时间门槛并适当调整他们的大小。将初始占用设置为较低值(默认值为70 iirc)意味着更频繁的完整gcs,这些gcs不会做太多,这并不好。你甚至有很多这样的生活很长一段时间?你可能会发现一个巨大的伊甸园,一个小的终身制是一个不错的选择。 – Matt 2011-03-17 10:09:36
较低的启动占用值是CMS更常见的,但没有问题。最大的问题STW,而2-3秒。吞吐量或0.0x秒STW对我来说不是问题。我已经尝试过大的伊甸园大小,但是STW的持续时间增加了:(如何设置并发阶段的线程数? – 2011-03-17 12:03:38