Websphere中的javacore,线程转储和堆转储之间的区别
有人能告诉我javacore,线程转储和堆转储之间的确切区别吗? 在哪种情况下,每一种都被使用?
线程转储是所有活动线程的堆栈的转储。 因此对于分析某个应用程序在某个时间点的运行情况,以及在诊断某些“执行”问题(例如,线程死锁)方面的时间间隔方面很有帮助。
堆转储是Java堆内存状态的转储。 因此对于分析应用程序在某个时间点使用什么内存非常有用,可以方便地诊断一些内存问题,并且在诊断内存泄漏时可以方便地进行。
这是“原始”术语,可以通过多种方式提供。 通常用于从JVM和应用程序服务器描述转储的文件,并以这种forms表示它们是低级别的工具。 如果由于某种原因你不能得到任何其他的东西,这很有用,但是你会发现使用体面的分析工具可以更轻松地获得类似信息,但是更容易parsing信息。
对于WebSphere,javacore文件是一个线程转储,虽然有很多其他信息,例如锁和加载的类以及一些有限的内存使用信息,而PHD文件是堆转储。
如果您想读取一个javacore文件,您可以手动完成,但是有一个IBM工具(BM线程和监视器转储分析器),这使得它更简单。 如果要读取堆转储文件,则需要使用许多IBM工具之一:MDD4J或堆分析器。
堆内存中的错误堆转储 – 内存对象的图片 – 用于内存分析Java内核 – 也称为线程转储或Java转储,用于查看线程活动在给定的时间在JVM内部。 除了线程和堆栈之外,IBM javacores还应该提供大量附加信息 – 用于确定挂起,死锁以及性能下降的原因系统核心
线程转储是所有线程的堆栈跟踪的转储,也就是说,每个线程突然抛出一个exception,并printStackTrace'ed。 这样就可以看到每个线程在某个特定点上正在做什么,例如捕获死锁就非常好。
堆转储是JVM正在使用的完整内存的“二进制转储”,例如,如果您需要知道为什么内存不足,可以使用堆转储。例如,在堆转储中,您可以看到有十亿用户对象,即使你应该只有一千个,这指向一个内存保留问题。
线程转储是在JVM中运行的线程的javacore显示快照,debugging挂起问题非常有用,它将提供有关java级别死锁的信息,同时还提供了更多有用信息,例如堆使用情况,每个CPU使用情况线程和整个堆的使用情况以及由JVM提供的类的数量。
Heapdumps提供了有关JVM的Java堆使用情况的信息,可用于debugging内存泄漏。 当JVM运行到超出内存的错误时,堆转储由IBM JVM生成,Heapdumps仅用于java中的堆泄漏,本地内存不足错误可能导致系统转储通常使用“GPF”常规保护错误。
JVM头转储是给定时间内JVM堆内存的快照。 所以它只是JVM的堆表示。 这是对象的状态。
JVM线程转储是给定时间的JVM线程的快照。 那么,线程在任何时候都在做什么。 这是线程的状态。 这有助于理解诸如locking的线程,挂起的线程和正在运行的线程。
头转储具有比线程转储更多的Java类级别信息。 例如,头转储很好地分析JVM堆内存问题和OutOfMemoryError错误。 当发生类似OutOfMemoryError的事情时,JVM头转储会自动生成。 可以通过使用kill -3来杀死进程来手动创build堆转储。 生成一个堆转储是一个密集的计算任务,这可能会挂你的jvm。 所以它不是一个通常使用的方法。 可以使用诸如eclipse内存分析器之类的工具来分析堆。
核心转储是对象的os级内存使用情况。 它比头部转储有更多的信息。 我们特意杀死一个进程时,不会创build核心转储。