导致 OOM 的线程的堆栈跟踪

Posted

技术标签:

【中文标题】导致 OOM 的线程的堆栈跟踪【英文标题】:Stack trace for thread causing an OOM 【发布时间】:2011-07-27 21:43:46 【问题描述】:

我有一个 java 应用程序正在获取 OutOfMemoryError,用于堆空间。我启用了 -XX:HeapDumpOnOutOfMemoryError,并获得了生成的 hprof 文件。

但是,转储显示堆、permgen 等中还有大量空间。我相信这可能是单个请求大量内存(例如 1 GB 数组)的原因,该请求失败并且因此不会出现在转储中。

基本上,我想在抛出 OOM 时查看导致 OOM 的线程堆栈。

这可能来自 hprof 转储吗?

【问题讨论】:

【参考方案1】:

它不在转储中,因为它在 OutOfMemoryError 中。如果您设法捕获并打印该错误的堆栈跟踪,它将告诉它发生在哪里。

【讨论】:

我猜就是这样!有点不幸,因为它是最重要的单条信息,并且在许多情况下(例如,由于远远超出可用内存的错误导致的大型数组请求)这是您唯一关心的事情。如果你没有设置日志,或者无法获取日志,我猜你就是 SOL。 我同意,尤其是当您使用 XX:HeapDumpOnOutOfMemoryError 时,它很容易包含跟踪!

以上是关于导致 OOM 的线程的堆栈跟踪的主要内容,如果未能解决你的问题,请参考以下文章

据称 std::thread 导致不可用的堆栈跟踪

了解 google play 给出的 ANR 堆栈跟踪

了解 LeakCanary 内存泄漏堆栈跟踪

在linux平台上用c/c++打印进程的所有线程堆栈跟踪

java线程的堆栈跟踪之jstack篇

jstack简介