Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 非常长的垃圾收集时间_Java_Garbage Collection_Jvm - Fatal编程技术网

Java 非常长的垃圾收集时间

Java 非常长的垃圾收集时间,java,garbage-collection,jvm,Java,Garbage Collection,Jvm,我们有一个运行Java6、Tomcat6、SpringFramework3、Hibernate4和EhCache的web应用程序。 我们有一个问题,垃圾收集时间过长,可能需要30秒或更长时间,导致应用程序没有响应 我们目前正在测试,但除了显而易见的:添加更多内存之外,我想知道是否有一些方面可以调整以减少垃圾收集时间 内存使用的主要原因是EHCache,因为我们正在积极地进行缓存。但我总是发现很难确定EHCache存储的大小(新的EHCache字节大小存储导致了各种各样的问题,因为缓存的对象图可能

我们有一个运行Java6、Tomcat6、SpringFramework3、Hibernate4和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

要减少GC时间,最好使用堆外内存。如果您可以移动尽可能多的大数据,那么即使有100 MB的堆外内存,您也可以将整个GC时间减少到10毫秒。我相信Ehcache支持堆外数据存储,但如果它不支持或您不能使用它,我建议您考虑使用其他替代方法


考虑到您的最大内存大小只有700 MB,看来您运行的服务器内存非常有限。否则,我建议您从8或16 GB的最大容量开始,如果您认为自己并不真正需要它,请减少内存大小。

FourSquare的人提供了一个非常好的工具。检查此链接和他们的快速示例。根据您在上述任何工具中找到的诊断,解决此问题的最佳解决方案将是添加更多RAM或为CPU处理器添加电源。如果您对某些基础架构更改持开放态度,请检查。但我认为第二种选择可能是一种延伸

在内存达到704MB的最大值之前,您是否会经历这么长的时间?JVM在决定增加使用的内存之前,可能会有点“激进”,试图减少使用的内存(并可能重新定位它)。如果您使用-Xms704m-Xmx704m启动,它的行为是否与此相同?使用“jstat-gc 1s pid”,您可以看到您的内存使用是否会影响托儿所,或者托儿所、eden和old之间的内存分配是否应该更改。除了使用JProDiffer/Yourkit分析您的应用程序之外,您不会有任何可靠的建议。当然,理想的解决方案是并发GC。但是只有少数几个实现。@Roger设置-Xms704m-Xmx704m似乎有点帮助,但很难说。仍然需要超过25秒。我已将EHCache设置设置为diskoverflow=“true”。我想知道这个问题是否与大量磁盘读/写有关。盒子上的内存似乎多少还行:在GC时代,内存大小不应该是个问题。只有在GC开始之前创建的对象的数量。@user2763361对象的数量非常重要,还有其他因素,如引用的数量和引用的生成方式,但它是您可以在监视工具中看到的大小。如果减少内存消耗,可以提高性能,因为这通常意味着减少对象的数量和间接引用的数量。简言之,你是对的,但是内存使用更容易测量。说得好。相关的: