我一直在查看jstat(-gc选项)中的日志,发现我们的应用程序花费了大量时间进行新一代收集。
我们将最大堆大小设置为16gigs(无最小值)。
这些是根据jstat日志的初始容量:
S0C:2112 S1C:2112 EC:17024 OC:63872
在整个剩余的时间里,尽管我们似乎有大量的新一代活动并且花费了大量时间,但S0C,S1C,EC都没有增加。然而,旧容量增加了。
我通过设置-XX:NewSize = 6G在UAT中进行了比较测试,并且应用程序执行得更好(很少有新一代事件,而且整体GC的时间也少得多)
我的问题是:为什么新一代产能不会随着我们的原始设置而增加?是否期望我最初必须分配更多内存?
我们正在使用JVM Hotspot 1.6。
这是来自JVM默认值的'New'的grep:
uintx MaxNewSize = 18446744073709486080{product}
intx NewRatio = 2 {product}
uintx NewSize = 1310720 {product}
uintx NewSizeThreadIncrease = 5320 {pd product}
intx PartialPeelNewPhiDelta = 0 {C2 product}
bool UseNewLongLShift = false {product}
bool UseParNewGC = false {product}
答案 0 :(得分:0)
我对热点1.6上的CMS人机工程学还不太了解,但如果你想让热点动态移动年轻一代的边界,你可能必须启用自适应大小调整策略并调整相关选项。
或者升级到更新的JVM并尝试使用G1GC,它肯定支持自适应大小调整。
CMS可能也没有使用新一代的完整可用尺寸,因为否则它无法满足其某些目标,例如:小gc暂停时间目标。确保它为新一代使用多线程GC,而不是串行GC。
我建议启用详细的GC日志记录,并查看它为次要世代所做的工作。