线程“http-8080-10”中的异常java.lang.OutOfMemoryError:Java

时间:2013-08-24 05:14:34

标签: java multithreading tomcat heap

我在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堆空间

2 个答案:

答案 0 :(得分:1)

您的问题可能是由一些事情造成的(在概念层面):

  • 您可能只是同时拥有太多用户或用户会话。

  • 您可能会尝试同时处理过多的用户请求。

  • 您可能正在尝试处理过大的请求(在某种意义上)。

  • 你可能有内存泄漏......这可能与上述某些问题有关,或者可能是无关的。

没有简单的解决方案。 (你已经尝试过唯一简单的解决方案......增加堆大小......但它没有用。)

解决此问题的第一步是更改JVM选项以使其在发生OOME时进行堆转储。然后使用内存转储分析器检查转储,并找出哪些对象使用了太多内存。那应该会给你一些证据,让你可以缩小可能的原因......

答案 1 :(得分:0)

如果你不断增加最大堆,你不断获得OutOfMemoryError,那么你的应用程序可能有内存泄漏,你必须通过进入代码并优化它来解决。除此之外,你别无选择,只能继续增加最大堆。

您可以查找内存泄漏并使用完全免费的工具进行优化,如下所示:

  1. 在应用程序使用大量内存时创建应用程序的堆转储,但在它崩溃之前,使用jmap作为Java安装使用的JVM的一部分容器(=你的情况下是tomcat):

    # if your process id is 1234
    jmap -dump:format=b,file=/var/tmp/dump.hprof 1234
    
  2. 使用Eclipse Memory Analyzer (MAT)

  3. 打开堆转储
  4. MAT提供有关潜在内存泄漏的建议。尝试遵循这些。

  5. 查看直方图标签。它显示转储时内存中的所有对象,按类分组。您可以按内存使用和对象数量进行排序。当你有内存泄漏时,通常会有太多令人震惊的事情,某些对象显然没有任何意义。我经常根据这些信息来追踪内存泄漏。

  6. 另一个有用的免费JVM监控工具是VisualVM。一个非免费但非常强大的工具是JProfiler