我们在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)
答案 0 :(得分:3)
您可以尝试使用jmap进行内存转储(在您提到的标记java 5
中,这样就可以了)。当服务器仍然工作时(例如每小时左右)进行多次转储。
然后在Eclipse MAT中分析它们。搜索在每个转储上变大的对象或对象集合。这很可能是你的内存泄漏。
答案 1 :(得分:0)
我看到两个选项,每个选项各有利弊:
安装探查器代理并在应用程序上连接探查器。这当然会产生一些严重的性能影响,这在您的生产环境中是不可接受的。但是,当堆空间几乎已满时,这将允许您监视应用程序并执行内存转储。
在其他地方重现您的生产环境,并使用分析器。如果您的问题仅出现在大负载下,您可能必须创建负载测试,以便到达OOME。
使用分析器是查找内存泄漏的最佳机会。
否则,您总是可以尝试使用PMD和Findbugs(以及其他静态分析工具)执行静态代码审查,这可能会发现一些错误。