JAVA/OOM: 当java 堆space 因OOM 崩溃时,如何转储所有信息?

JAVA/OOM: How to dump all information on java heap space when it crashes due to OOM?

我是 JAVA 的新手。 我 运行 在 JAVA 中实现的分布式框架之上的程序。

当我使用大数据时,程序因内存不足而崩溃,并出现一些错误堆栈。但是错误堆栈不包含我要查找的信息。

我想检查什么类型的数据结构(java 对象)在崩溃时正在消耗堆 space。

有什么众所周知的技巧、方法或工具吗?

谢谢,

当 JVM 中出现 OutOfMemoryError 时,使用 HeapDumpOnOutOfMemoryErrorHeapDumpPath 选项生成堆转储。

例如:

$ java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/some/path MyApp

如果您怀疑存在内存泄漏,您可以使用 JDK 中包含的 jmap 生成应用程序 的堆转储,而它是 运行.

例如:

jmap -dump:live,format=b,file=dump.hprof <pid>

然后您可以使用 YourKit 等应用程序分析 dump.hprof 以查明导致泄漏的代码。

参考资料

  1. https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/clopts001.html

  2. https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr014.html