我一直在查看jstat (-gc选项)的日志,发现我们的应用程序花费了大量时间进行新一代收集。
我们已将最大堆大小设置为16 no(无最小值)。
以下是根据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}发布于 2015-01-09 09:45:08
我对hotspot 1.6上的CMS人体工学不太确定,但如果你想让hotspot动态移动年轻一代的边界,可能你必须启用自适应大小策略并调整相关选项。
或者升级到较新的JVM并尝试使用G1GC,它绝对支持自适应大小调整。
这也可能是CMS没有使用新一代的全部可用大小,因为否则它无法达到它的一些目标,例如次要gc暂停时间目标。确保它使用的是新一代的多线程GC,而不是串行GC。
我建议启用详细的GC日志记录,并查看它对次要生成的作用。
https://stackoverflow.com/questions/27685310
复制相似问题