Websphere 中 javacore、thread dump 和 heap dump 之间的区别

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


答案 1

线程转储是所有活动线程堆栈的转储。因此,对于分析应用程序在某个时间点处于什么状态很有用,如果每隔一段时间就可以诊断某些类型的“执行”问题(例如线程死锁)来方便地完成。

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

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

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

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


答案 2

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

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

与线程转储相比,头转储具有更多的 java 类级别信息。例如,Head 转储非常适合分析 JVM 堆内存问题和 OutOfMemoror 错误。JVM 头转储是在发生类似 OutOfMemoryError 之类的事情时自动生成的。堆转储可以通过使用 kill -3 杀死进程来手动创建。生成堆转储是一项密集的计算任务,可能会挂起您的 jvm。所以它不是一个安全的使用。可以使用 eclipse memory analyser 等工具对堆进行分析。

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