如何可靠地进行 Java 堆转储?

kar*_*cyr 9 java outofmemoryerror dump oom

我的团队在尝试进行由 OutOfMemoryErrors 触发的良好堆转储时遇到了困难。出于特定原因,我们目前正在使用从 bash 脚本调用的 jmap 进行转储,而不是使用 HeapDumpOnOutOfMemoryError 标志。我们使用的是 64 位 1.6 JVM,堆大小约为 3 GB。我们的堆转储失败 90% 的时间(猜测)。

有什么我们可以做的事情来提高我们获得干净的堆转储的几率,我们可以用它来解决内存问题吗?我已经读到 jmap 在 Java 1.4 中存在重大问题,但现在应该主要解决这些问题。

fgl*_*lez 7

你的操作系统是哪个?(我无法添加评论)。

对于 Solaris,我们首先强制进行核心转储 ( gcore <pid>) 然后将 jmap 附加到核心转储文件 ( jmap -heap:format=b <path to java bin> <path to core>)

gcore是一个 *nix 实用程序,用于生成正在运行的程序的图像。见链接


ryt*_*tis 2

我们有一个查询 ManagementFactory.getThreadMXBean() 并生成报告的 JSP。当应用程序崩溃时可能没有用,但如果您每分钟左右进行一次轮询,您就会了解发生了什么。

更多信息请点击这里。