JAVA/OOM:由于OOM而崩溃时,如何转储java堆空间上的所有信息?

syk*_*yko 3 java jvm out-of-memory

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

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

我想检查崩溃时哪些类型的数据结构(java 对象)正在消耗堆空间。

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

谢谢,

ck1*_*ck1 6

当JVM 中发生异常时,使用HeapDumpOnOutOfMemoryErrorHeapDumpPath选项生成堆转储。OutOfMemoryError

例如:

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

如果您怀疑存在内存泄漏,可以使用jmapJDK 中包含的 来生成应用程序运行时的堆转储。

例如:

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

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

参考

  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