生成核心转储时Jstack和gcore之间的区别?

问题描述:

我们都知道Core Dump是分析Unix中各种进程的基本诊断工具。我知道jstack和gcore都用于生成Javacore文件或Core Dump,但我怀疑Gcore主要用于进程,Jstack用于线程。生成核心转储时Jstack和gcore之间的区别?

从操作系统的角度来看,虽然进程和线程相互关联(进程只包含线程),但它们在内存/速度/执行方面存在较大差异。那么gcore会诊断这个过程,jstack会分析这个过程中的线程吗?

GCore在操作系统级别操作,并且您得到了当前正在运行的本机代码的转储。从Java的角度来看,这是不可理解的。

JStack让你在你的应用程序拥有的所有线程的VM级别(Java堆栈)获得堆栈跟踪。您可以从中找到在某个点执行的真正的java代码。

显然,GCore几乎从不使用(太低级,本机代码...)。本地库或类似的东西只有真正奇怪的问题可能需要这种工具。

还有一个jmap可以生成一个hprof文件,它是来自您的VM的堆数据。像'Memory Analyser Tool'这样的工具可以打开hprof,并且可以深入研究发生了什么(在内存一侧)。 如果您的虚拟机由于OutOfMemory而崩溃,您还可以设置参数以在事件发生时获取hprof。它有助于理解为什么(太多的用户,数据库查询获取太多的数据...)

最后一件事情是,您可以添加一个调试选项,当您启动您的虚拟机,以便您可以连接到它,并在运行过程中进行调试。如果您有一些您无法在当地环境中重现的奇怪问题,它可以提供帮助。

+0

我从上面假设gcore对于Core Dump很有用,Jstack对Thread Dump很有用。两者之间的区别可以在链接中找到。 https://middlewarebyashok.wordpress.com/2016/03/19/heap-dump-and-threaddump-and-core-dump-explanations/ –