我们有一个运行Java 6,Tomcat 6,Spring Framework 3,Hibernate 4,EhCache的Web应用程序。 我们遇到的问题是垃圾收集时间极长,可能需要30秒或更长时间,导致应用程序无响应。
我们目前正在测试,但除了显而易见之外:添加更多内存,我想知道是否有方面我们可以调整以减少垃圾收集时间。
内存使用的主要贡献者是EHCache,因为我们正在积极地缓存。但我总是发现很难确定EHCache存储的大小(新的EhCache字节大小存储,导致我们遇到各种各样的问题,因为缓存的对象图可能非常大)。
这些是我对JVM的设置
JAVA_OPTS="$JAVA_OPTS -server -Xms256m -Xmx704m XX:OnOutOfMemoryError=/usr/share/scripts/on_server_crash.sh -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/tomcat6 -XX:MaxPermSize=192m -XX:+UseConcMarkSweepGC
答案 0 :(得分:3)
要减少GC时间,您可以做的最好的事情就是使用堆内存。如果您可以移动尽可能多的大数据,即使有100 MB的堆内存,也可以将完整的GC时间缩短到10毫秒。我相信Ehcache支持堆数据存储,但如果没有,或者你不能使用它,我建议你看一下替代方案。
鉴于您只有700 MB的最大内存大小,您似乎在内存非常有限的服务器上运行。否则我会建议您从最大8或16 GB开始,如果您认为自己并不真正需要,请减小内存大小。
答案 1 :(得分:1)
FourSquare的人们有一个很好的工具。查看此链接以及他们的快速示例。 Foursquare Heap tool. 。根据您在上述任何工具中找到的诊断,解决问题的大多数排序解决方案是添加更多RAM或为CPU处理器增加电源。如果您对某些基础架构更改持开放态,请检查 Zing from Azul Systems。但我认为第二种选择可能是一个延伸。