1

我们在 Windows 上使用 JBoss_4_0_4_GA 和 JDK 1.5.0(无更新)

JBoss 服务器在 Wrapper(版本 3.2.3)http://wrapper.tanukisoftware.org中运行。

由于 JVM 太老了,我什至不能在 JVM 上使用 -XX:+HeapDumpOnOutOfMemoryError 选项。

找出问题的方法是什么?

像往常一样,内存不足异常发生在应用程序的不同部分。

我无权立即升级 JVM。

    The current VM settings
    Java Additional Parameters
    wrapper.java.additional.1=-Xms512m
    wrapper.java.additional.2=-Xmx1024m
    wrapper.java.additional.3=-Dsun.rmi.dgc.client.gcInterval=3600000
    wrapper.java.additional.4=-Dsun.rmi.dgc.server.gcInterval=3600000
    wrapper.java.additional.5=-Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParser
    wrapper.java.additional.6=-Djava.endorsed.dirs=D:/jboss-4.0.4.GA/lib/endorsed

异常片段

信息 | 虚拟机 1 | 2012/05/31 11:25:03 | 11:25:03,502 错误 [SOAPFaultExceptionHelper] SOAP 请求异常信息 | 虚拟机 1 | 2012/05/31 11:25:03 | java.rmi.RemoteException: java.lang.OutOfMemoryError: Java 堆空间;嵌套异常是:INFO | 虚拟机 1 | 2012/05/31 11:25:03 | java.util.concurrent.ExecutionException:java.lang.OutOfMemoryError:Java 堆空间

信息 | 虚拟机 1 | 2012/05/31 11:25:03 | 引起:java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Java heap space INFO | 虚拟机 1 | 2012/05/31 11:25:03 | 在 java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:205) 信息 | 虚拟机 1 | 2012/05/31 11:25:03 | 在 java.util.concurrent.FutureTask.get(FutureTask.java:80)

4

2 回答 2

3

您可以尝试使用jmap进行内存转储(在您提到的标签中java 5,所以这应该是可能的)。当服务器仍然工作时(例如每隔一小时左右)进行几次转储。

然后在Eclipse MAT中分析它们。搜索在每次转储时变大的对象或对象集合。这很可能是您的内存泄漏。

于 2012-06-01T18:10:13.383 回答
0

我看到两个选项,每个选项都有其优点和缺点:

  1. 安装探查器代理并在您的应用程序上连接探查器。这当然会产生一些严重的性能影响,这在您的生产环境中可能是不可接受的。但这将允许您监视应用程序并在堆空间几乎已满时执行内存转储。

  2. 在其他地方重现您的生产环境,并使用分析器。如果您的问题仅在大负载时出现,您可能必须创建负载测试才能达到 OOME。

使用分析器是查找内存泄漏的最佳机会。

否则,您总是可以尝试使用 PMD 和 Findbugs(以及其他静态分析工具)执行静态代码审查,这可能会发现一些错误。

于 2012-06-01T18:05:27.957 回答