0

我一直在查看来自 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 默认值中“新”的 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}
4

1 回答 1

0

我对热点 1.6 上的 CMS 人体工程学还不确定,但如果您希望热点动态移动年轻一代的边界,您可能必须启用自适应大小调整策略并调整相关选项。

或者升级到更新的 JVM 并尝试使用 G1GC,它肯定支持自适应大小。

也可能是 CMS 没有为新一代使用完整的可用大小,因为否则它无法满足其某些目标,例如次要 gc 暂停时间目标。确保它为新一代使用多线程 GC,而不是串行 GC。

我建议启用详细的 GC 日志记录并查看它对次世代的作用。

于 2015-01-09T01:45:07.977 回答