15

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

2 回答 2

4

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

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

于 2012-06-24T17:41:48.900 回答
1

FourSquare 的人提供了一个出色的工具。检查此链接和他们拥有的快速示例。Foursquare 堆工具。. 根据您在上述任何工具中找到的诊断结果,解决问题的最有序解决方案将是添加更多 RAM 或增加 CPU 处理器的功率。如果您愿意接受某些基础架构更改,请查看Azul Systems 的 Zing。但我认为第二种选择可能有点牵强。

于 2012-06-24T22:54:49.840 回答