如何解决生产系统中的Out Of Memory错误

时间:2012-06-01 17:33:07

标签: java jvm out-of-memory java-5 jboss-4.0.x

我们在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

例外的片段

  

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

     

INFO | jvm 1 | 2012/05/31 11:25:03 |引起:java.util.concurrent.ExecutionException:java.lang.OutOfMemoryError:Java堆空间INFO | jvm 1 | 2012/05/31 11:25:03 | at java.util.concurrent.FutureTask $ Sync.innerGet(FutureTask.java:205)INFO | jvm 1 | 2012/05/31 11:25:03 |在java.util.concurrent.FutureTask.get(FutureTask.java:80)

2 个答案:

答案 0 :(得分:3)

您可以尝试使用jmap进行内存转储(在您提到的标记java 5中,这样就可以了)。当服务器仍然工作时(例如每小时左右)进行多次转储。

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

答案 1 :(得分:0)

我看到两个选项,每个选项各有利弊:

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

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

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

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