java-Websph中的javacore,线程转储和堆转储之间的区别

有人可以告诉我javacore,线程转储和堆转储之间的确切区别吗? 在哪种情况下使用这些?

5个解决方案

53 votes

线程转储是所有活动线程的堆栈的转储。 因此对于分析某个应用程序在某个时间点的功能很有用,并且如果在一定的间隔内完成操作,则在诊断某些类型的“执行”问题(例如线程死锁)时非常有用。

堆转储是Java堆内存状态的转储。 因此,对于分析应用程序在某个时间点对内存的使用很有用,因此在诊断某些内存问题时非常方便,如果在一定间隔内完成操作,则在诊断内存泄漏时非常方便。

这就是它们的“原始”术语,可以通过多种方式提供。 通常用于描述从JVM和应用程序服务器转储的文件,并且以这种形式,它们是低级工具。 如果由于某种原因您什么都没得到,则很有用,但是使用体面的分析工具来获得相似但更容易剖析的信息,您会发现生活更加轻松。

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

如果您想手动读取javacore文件,可以使用IBM工具(BM Thread and Monitor Dump Analyzer)来简化。 如果要读取堆转储文件,则需要许多IBM工具之一:MDD4J或堆分析器。

Jason answered 2020-01-16T01:29:11Z

2 votes

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

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

头转储比线程转储具有更多的Java类级别信息。 例如,Head dump非常适合分析JVM堆内存问题和OutOfMemoryError错误。 当发生类似OutOfMemoryError的事件时,会自动生成JVM头转储。 可以通过使用kill -3终止进程来手动创建堆转储。 生成堆转储是一项繁重的计算任务,可能会使您的jvm挂起。 因此,经常使用它不是一种方法。 可以使用诸如日食内存分析器之类的工具来分析堆。

核心转储是对象的操作系统级别内存使用情况。 它比堆头信息更多。 当我们有意终止进程时,不会创建核心转储。

Nu-ONE answered 2020-01-16T01:29:45Z
1 votes

希望在任何时候看到内存中保留的内容时都会进行堆转储内存不足错误堆转储-内存中对象的图片-用于内存分析Java核心-也称为线程转储或Java转储,用于在给定时间查看JVM内部的线程活动。 IBM javacores应该很多除线程和堆栈外的其他信息-用于确定挂起,死锁和性能下降的原因系统核心

answered 2020-01-16T01:30:06Z
1 votes

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

堆转储是JVM使用的全部内存的“二进制转储”,例如,在您需要知道为什么内存不足的情况下很有用-例如,在堆转储中,您可以看到您有十亿 用户对象(即使您只有1000个)也指向内存保留问题。

stolsvik answered 2020-01-16T01:30:31Z
0 votes

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

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

Krishna Jaladhi answered 2020-01-16T01:30:56Z