极长的垃圾回收时间

2022-09-03 15:58:19

我们有一个运行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

答案 1

要减少 GC 时间,您可以做的最好的事情是使用堆外内存。如果您可以移动尽可能多的大型数据,则可以将完整的 GC 时间减少到低至 10 毫秒,即使有 100 MB 的堆外内存也是如此。我相信Ehcache支持堆数据存储,但如果它没有,或者你不能使用它,我建议你看看替代方案。

假设您只有700 MB的最大内存大小,则似乎您正在内存非常有限的服务器上运行。否则,我建议您从最大8或16 GB开始,如果您认为自己并不是真的需要它,请减小内存大小。


答案 2

FourSquare人有一个很棒的工具。检查此链接和他们拥有的快速示例。四方堆工具。 .根据您在上述任何工具中找到的诊断程序,解决此问题的大多数排序解决方案是添加更多RAM或为CPU处理器增加电源。如果您对某些基础设施变更持开放态度,请查看Azul Systems的Zing。但我认为第二种选择可能是一种延伸。