60

有人能告诉我javacore、线程转储和堆转储之间的确切区别吗?在什么情况下使用这些中的每一个?

4

5 回答 5

64

线程转储是所有活动线程的堆栈的转储。因此,对于分析应用程序在某个时间点的进度非常有用,并且如果在诊断某些“执行”问题(例如线程死锁)时很方便。

堆转储是 Java 堆内存状态的转储。因此,对于分析应用程序在某个时间点对内存的使用情况非常有用,因此在诊断某些内存问题时非常方便,并且如果在诊断内存泄漏时方便。

这就是它们的“原始”术语,可以通过多种方式提供。通常用于描述来自 JVM 和应用服务器的转储文件,在这种形式下,它们是一种低级工具。如果由于某种原因您无法获得其他任何东西,这很有用,但是您会发现使用体面的分析工具来获得类似但更容易剖析信息的生活会更轻松。

对于 WebSphere,javacore 文件是一个线程转储,尽管它包含许多其他信息,例如锁和加载的类以及一些有限的内存使用信息,而 PHD 文件是一个堆转储。

如果您想读取 javacore 文件,您可以手动执行,但是有一个 IBM 工具(BM Thread and Monitor Dump Analyzer)可以使它更简单。如果要读取堆转储文件,您需要许多 IBM 工具之一:MDD4J 或堆分析器。

于 2010-08-31T10:40:32.220 回答
3

JVM 头转储是给定时间内 JVM 堆内存的快照。所以它只是 JVM 的堆表示。那就是对象的状态。

JVM 线程转储是 JVM 线程在给定时间的快照。这就是线程在任何给定时间所做的事情。这是线程的状态。这有助于理解诸如锁定的线程、挂起的线程和正在运行的线程。

头转储比线程转储具有更多的 java 类级别信息。例如 Head dump 可以很好地分析 JVM 堆内存问题和 OutOfMemoryError 错误。当发生 OutOfMemoryError 之类的情况时,会自动生成 JVM 头转储。可以通过使用 kill -3 终止进程来手动创建堆转储。生成堆转储是一项密集的计算任务,它可能会挂起你的 jvm。所以它不是一个经常使用的方法。可以使用 eclipse 内存分析器等工具来分析堆。

核心转储是对象的操作系统级别内存使用。它比头部转储提供更多信息。当我们故意杀死一个进程时,不会创建核心转储。

于 2017-08-13T06:10:04.683 回答
1

堆转储,您希望随时查看内存中保存的内容 内存不足错误 堆转储 - 内存中对象的图片 - 用于内存分析 Java 内核 - 也称为线程转储或 Java 转储,用于查看线程活动在给定时间在 JVM 内部。除了线程和堆栈之外,IBM javacores 还应该有很多附加信息——用于确定挂起、死锁和性能下降的原因系统核心

于 2009-08-25T11:32:27.337 回答
1

线程转储是所有线程的堆栈跟踪的转储,即好像每个线程突然抛出一个异常并 printStackTrace'ed。这样您就可以看到每个线程在某个特定点正在做什么,例如非常适合捕获死锁。

堆转储是 JVM 正在使用的完整内存的“二进制转储”,例如,如果您需要知道内存不足的原因 - 例如,在堆转储中,您可以看到您有 10 亿用户对象,即使您应该只有一千个,这表明存在内存保留问题。

于 2009-11-26T13:51:04.093 回答
0

线程转储是 javacore 显示在 JVM 中运行的线程的快照,它对调试挂起问题很有用,它将提供有关 java 级别死锁的信息,并且 javacores 的 IBm 版本提供了更多有用的信息,例如堆使用情况、每个 CPU 使用情况线程和整体堆使用情况以及 JVM 加载的类的数量。

Heapdumps,提供有关 JVM 使用 Java 堆的信息,可用于调试内存泄漏。当 JVM 遇到内存不足错误时,IBM JVM 会生成堆转储,堆转储仅用于 java 中的堆泄漏,本机内存不足错误可能导致系统转储通常带有“GPF”一般保护错误。

于 2016-02-08T13:49:03.340 回答