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