如何找到哪个类导致JVM的OutOfMemory?

时间:2011-02-18 19:09:45

标签: java jvm weblogic out-of-memory

Oflate我们的Weblogic服务器经常因OutOfMemory错误而崩溃。有什么方法可以监视JVM,找出哪些类占用内存并拥有最大数量的对象?

5 个答案:

答案 0 :(得分:4)

是肯定的。我这样做的方法是配置jvm以在OOM上创建堆转储,然后我将堆拉下来并通过jvisualvm运行它。你可以计算保留的大小(花了很长时间),但非常清楚罪犯是什么。

您还可以将jvisualvm附加到正在运行的实例,但您需要配置jvm以接受连接。这样你就可以看到堆实时增长。看到这个;它的jboss,但应该非常相似:https://wiki.projectbamboo.org/display/BTECH/VisualVM+Profiler

我认为在你进行堆转储之后找到答案会更容易,因为当你实时看到它时会收集垃圾和诸如此类的东西。

编辑 - 这是我的启动配置。

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps  
-Xloggc:/path/to/memlogs/memlog.txt -XX:+PrintTenuringDistribution   
-Xms1024m -Xmx2048m -XX:MaxPermSize=128m   
-server -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=xxxx   
-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false   
-Djava.rmi.server.hostname=<ip-address> -XX:+HeapDumpOnOutOfMemoryError   
-XX:HeapDumpPath=/path/to/heapdumps/ -XX:+CMSClassUnloadingEnabled   
-XX:+CMSPermGenSweepingEnabled -XX:+UseConcMarkSweepGC  

因为我将其配置为删除内存日志,所以我可以实时查看memlog.txt文件,看看发生了什么。如果我愿意的话,我可以连接到jvm,但就像我说的那样,我会在崩溃后分析堆,看看问题是什么,因为事实上它真的很清楚....

答案 1 :(得分:2)

从JDK 1.5开始有JConsole(或5.0,如果你进入那个)。

答案 2 :(得分:2)

有很多工具,但我使用Eclipse的Memory Analysis Toolkit。您可以将其作为独立工具下载,它可以让您进行堆分析甚至连接到JVM并在那里进行分析。

答案 3 :(得分:2)

超越JConsole,jRat是一款优秀的免费啤酒分析器,YourKit是另一款出色的商业产品。

答案 4 :(得分:0)

我从其他一些问题中了解了jhat和jmap。这些已经在JDK包中提供。此外,以下链接提供了一个很好的列表,列出了在哪些情况下使用的工具: -

http://java.sun.com/developer/technicalArticles/J2SE/monitoring/