我在64位Windows Server 2003,Oracle 11G数据库和Apache Tomcat 6.0 Web服务器上运行了一个Web应用程序。
应用程序在实时环境中,大约有3000名用户使用我遇到的Java Heap Out Of Memory Error。增加堆空间后它就解决了。
现在我再次遇到同样的问题,下面是错误堆栈跟踪:
线程中的执行“http-8080-10”java.lang.OutOfMemoryError:Java 堆空间2013年8月23日下午8:48:00 com.SessionClunter getActiveSessions线程“http-8080-11”中的执行 java.lang.OutOfMemoryError:Java堆空间线程中的Exeption “http-8080-4”线程中的执行“http-8080-7” java.lang.OutOfMemoryError:Java堆空间
答案 0 :(得分:1)
您的问题可能是由一些事情造成的(在概念层面):
您可能只是同时拥有太多用户或用户会话。
您可能会尝试同时处理过多的用户请求。
您可能正在尝试处理过大的请求(在某种意义上)。
你可能有内存泄漏......这可能与上述某些问题有关,或者可能是无关的。
没有简单的解决方案。 (你已经尝试过唯一简单的解决方案......增加堆大小......但它没有用。)
解决此问题的第一步是更改JVM选项以使其在发生OOME时进行堆转储。然后使用内存转储分析器检查转储,并找出哪些对象使用了太多内存。那应该会给你一些证据,让你可以缩小可能的原因......
答案 1 :(得分:0)
如果你不断增加最大堆,你不断获得OutOfMemoryError
,那么你的应用程序可能有内存泄漏,你必须通过进入代码并优化它来解决。除此之外,你别无选择,只能继续增加最大堆。
您可以查找内存泄漏并使用完全免费的工具进行优化,如下所示:
在应用程序使用大量内存时创建应用程序的堆转储,但在它崩溃之前,使用jmap
作为Java
安装使用的JVM
的一部分容器(=你的情况下是tomcat):
# if your process id is 1234
jmap -dump:format=b,file=/var/tmp/dump.hprof 1234
MAT提供有关潜在内存泄漏的建议。尝试遵循这些。
查看直方图标签。它显示转储时内存中的所有对象,按类分组。您可以按内存使用和对象数量进行排序。当你有内存泄漏时,通常会有太多令人震惊的事情,某些对象显然没有任何意义。我经常根据这些信息来追踪内存泄漏。