0

我有一个在我的 64 位 Windows Server 2003、Oracle 11G 数据库和 Apache Tomcat 6.0 Web 服务器上运行的 Web 应用程序。

应用程序在实时环境中,大约 3000 名用户使用该应用程序我遇到了 Java 堆内存不足错误。增加堆空间后,它就解决了。

现在我又面临同样的问题,下面是错误堆栈跟踪:

线程“http-8080-10”中的异常 java.lang.OutOfMemoryError:Java 堆空间 2013 年 8 月 23 日晚上 8:48:00 com.SessionClunter getActiveSessions 线程“http-8080-11”中的异常 java.lang.OutOfMemoryError:Java线程“http-8080-4”中的堆空间异常 线程“http-8080-7”中的异常 java.lang.OutOfMemoryError:Java 堆空间

4

2 回答 2

1

您的问题可能是由几件事引起的(在概念层面):

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

  • 您可能正试图同时处理太多的用户请求。

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

  • 您可能有内存泄漏......这可能与上述某些问题有关,也可能无关。

没有简单的解决方案。(您已经尝试了唯一简单的解决方案......增加堆大小......但它没有奏效。)

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

于 2013-08-24T05:25:56.810 回答
0

如果OutOfMemoryError无论增加多少最大堆都继续获取,那么您的应用程序可能存在内存泄漏,您必须通过进入代码并对其进行优化来解决这个问题。除此之外,您别无选择,只能不断增加最大堆,直到可以为止。

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

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

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

  3. MAT 提供有关潜在内存泄漏的建议。尝试遵循这些。

  4. 查看直方图选项卡。它显示了转储时内存中的所有对象,按它们的类分组。您可以按内存使用和对象数量进行排序。当您发生内存泄漏时,通常会出现令人震惊的太多某些对象的实例,这些对象显然并不完全有意义。我经常仅根据这些信息来追踪内存泄漏。

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

于 2013-08-24T05:29:42.470 回答