最近我们的 Weblogic 服务器经常因 OutOfMemory 错误而崩溃。有什么方法可以监视 JVM 以找出哪些类正在占用内存并拥有最大数量的对象?
最佳答案
是的。我这样做的方法是配置 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,但是就像我说的那样,我只会在崩溃后分析堆以查看问题所在,因为事后它真的很清楚....
关于java - 如何找到哪个类导致 JVM 内存不足?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5045495/