我们在Tomcat(Java 1.5)上运行Spring + Hibernate Web应用程序。目前我们使用2GB的堆空间(我被告知它是Solaris 32位服务器上的最大可能,尽管Server总共有16GB RAM)。目前的JAVA_OPTS是:
-XX:MaxPermSize = 512m -XX:+ UseParallelGC -Xms2048m -Xmx2048m
Young Gen + Survivor空间约为600 MB,Old Gen为1.4 GB。
有时间内存已满,我们需要重启Tomcat。以下是观察结果:
我们想要更改为以下JAVA_OPTIONS - 我需要反馈是否这是明智的选择(UAT环境与Prod env的负载不匹配,我们无法在UAT中复制相同的内容)
添加-Xmn1024m - 这是为了确保Young Gen对象不容易升级为Old Gen.有关增加/减少此项的任何建议吗?这也将导致更多的Young Gen GC和较小的Old Gen GC。
-XX:+ UseParallelOldGC - 这是为了让Young和Old Gen GC运行多个线程,以便更快地获得GC。
2GB的限制是否也适用于Solaris服务器?堆不能增加到2GB以上吗?
请分享您对上述内容的看法。
谢谢, Midhun
答案 0 :(得分:0)
如果您经历了太长时间的主要收藏暂停,则应考虑使用-XX:+UseConcMarkSweepGC
(并保留-XX:+UseParallelOldGC
)以便同时执行GC。
你使用-Xms2048m -Xmx2048m
的事实可能是一个坏主意,如果这些值不是很好,你不要让JVM扩展它们(但如果你肯定没问题)。
在 Java Performance Tuning 2nd Ed。中,经常有关于堆大小的建议:
- 将起始堆大小设置为与最大堆大小相同
- 将起始大小设置为最大活动对象数所需的大小,并将最大值设置为此金额的4倍
- 将起始堆设置为最大堆大小
- 将起始堆大小设置为最大堆大小的1/10到1/4
- 使用默认的初始堆大小
醇>
(尽量找到最适合你的人)
本文档为resolve GC issue提供了很好的建议,请仔细阅读生成大小调整,并尝试使用某些命令打印您的GC活动,其中一些可能真的有助于查看您的应用或GC配置中的一些瓶颈。