【发布时间】:2011-02-18 19:09:45
【问题描述】:
我们的 Weblogic 服务器经常因 OutOfMemory 错误而崩溃。有什么方法可以监控 JVM 以找出哪些类正在占用内存并拥有最大数量的对象?
【问题讨论】:
标签: java jvm weblogic out-of-memory
我们的 Weblogic 服务器经常因 OutOfMemory 错误而崩溃。有什么方法可以监控 JVM 以找出哪些类正在占用内存并拥有最大数量的对象?
【问题讨论】:
标签: java jvm weblogic out-of-memory
是的。我这样做的方法是配置 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,但就像我说的那样,我只会在崩溃后分析堆以查看问题所在,因为事实上它真的很清楚......
【讨论】:
JConsole 从 JDK 1.5(或 5.0,如果你喜欢的话)开始。
【讨论】:
那里有很多工具,但我使用的是 Eclipse 的内存分析工具包。您可以将它作为独立工具下载,它可以让您进行堆分析,甚至连接到 JVM 并在那里进行分析。
【讨论】:
除了 JConsole,jRat 是一款出色的免费啤酒分析器,YourKit 是另一款出色的商业产品。
【讨论】:
从其他一些问题中我开始了解 jhat 和 jmap。这些已经在 JDK 包中可用。以下链接还提供了一个很好的列表,说明在哪些场景中使用哪种工具:-
http://java.sun.com/developer/technicalArticles/J2SE/monitoring/
【讨论】: