Websphere中javacore,线程转储和堆转储之间的区别

时间:2009-08-19 14:55:56

标签: java multithreading websphere heap dump

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

5 个答案:

答案 0 :(得分:51)

线程转储是所有活动线程堆栈的转储。因此,在某个时间点分析应用程序的用途,以及在诊断某些“执行”问题(例如线程死锁)时是否有用。

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

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

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

如果你想阅读一个javacore文件,你可以手工完成,但是有一个IBM工具(BM线程和监视器转储分析器),这使得它更简单。如果要读取堆转储文件,则需要使用许多IBM工具之一:MDD4J或Heap Analyzer。

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:1)

堆转储,只要您希望查看内存中的内容,就会出现内存错误 堆转储 - 内存对象的图片 - 用于内存分析 Java核心 - 也称为线程转储或java转储,用于在给定时间查看JVM内的线程活动。 IBM javacores应该很多 除了线程和堆栈之外的其他信息 - 用于确定挂起,死锁和性能降级的原因 系统核心

答案 3 :(得分:1)

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

堆转储是JVM正在使用的完整内存的“二进制转储”,例如,如果您需要知道内存不足的原因,那么它很有用 - 例如,在堆转储中,您可以看到拥有十亿个User对象,即使你应该只有一千个,这也就是内存保留问题。

答案 4 :(得分:0)

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

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