我有一个在jboss5下运行的应用程序。它具有用户登录端以及后台石英作业。一项后台作业进行了紧急呼叫,并拉下一个大对象进行解析。它使用大量的内存。
我看到这样的一种模式:何时出现如下OOM异常:
2013-06-04 21:44:36,855 ERROR [STDERR] (QuartzScheduler_Scheduler-NON_CLUSTERED_MisfireHandler) java.lang.OutOfMemoryError: Java heap space
2013-06-04 21:44:36,855 ERROR [STDERR] (http-0.0.0.0-80-9) Exception in thread "http-0.0.0.0-80-9"
2013-06-04 21:44:36,855 ERROR [STDERR] (http-0.0.0.0-80-9) java.lang.OutOfMemoryError: Java heap space
2013-06-04 21:44:36,855 ERROR [STDERR] (Session Monitor) Exception in thread "Session Monitor"
2013-06-04 21:44:36,855 ERROR [STDERR] (Monitor Runner) java.lang.OutOfMemoryError: Java heap space
2013-06-04 21:44:36,855 ERROR [STDERR] (Monitor Runner) at java.util.Arrays.copyOf(Arrays.java:2219)
2013-06-04 21:44:36,855 ERROR [STDERR] (Monitor Runner) at java.util.ArrayList.toArray(ArrayList.java:329)
2013-06-04 21:44:36,855 ERROR [STDERR] (Monitor Runner) at java.util.ArrayList.<init>(ArrayList.java:151)
2013-06-04 21:44:36,855 ERROR [STDERR] (Monitor Runner) at com.icesoft.util.MonitorRunner$1.run(MonitorRunner.java:54)
这项工作每晚进行。当几天没有人使用UI时,几天后我将获得OOM。但是,当人们每天使用UI应用程序时,我可以花一个多月或更长时间,却再也看不到OOM问题。
使用该应用程序时似乎发生了一些好事,但我不知道该怎么办。有谁知道从哪里开始寻找和尝试什么?
我们正在使用jdk 1.7.0.11,而javaopts是
set "JAVA_OPTS=-Xrs -Xms256M -Xmx4096M -XX:MaxPermSize=256m -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC "
谢谢,
吉姆
最佳答案
使用-XX:+HeapDumpOnOutOfMemoryError
JVM参数,然后在MAT中打开堆转储。 MAT将向您显示OOM的可疑对象,您甚至可以亲自浏览堆并确定哪些对象占据了堆的大部分。这样,您就可以轻松找到问题的根源。
另外,这将有助于启用GC日志记录,因此您可以查看是否存在导致OOM的任何模式。
关于java - 奇怪的Java JVM内存不足,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17306489/