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

Difference between Jstack and gcore when generating Core Dumps?

我们都知道Core Dumps是分析Unix各种进程的必备诊断工具。我知道 jstack 和 gcore 都用于生成 Javacore 文件或核心转储,但我怀疑 Gcore 主要用于进程而 Jstack 用于线程。

从操作系统的角度来看,进程和线程虽然相互关联(进程仅由线程组成),但它们彼此相对不同 w.r.t memory/speed/execution 。那么gcore会诊断进程而jstack会分析该进程中的线程吗???

GCore 在 OS 级别运行,您得到了当前 运行 的本机代码转储。从java的角度来看,其实不是很能理解。

JStack 为您提供应用程序所有线程在 VM 级别(java 堆栈)的堆栈跟踪。你可以从中找到真正的 java 代码在某一点执行。

很明显,GCore 几乎从未被使用过(级别太低,原生代码...)。只有本机库或类似东西的真正奇怪的问题才可能需要这种工具。

还有 jmap 可以生成一个 hprof 文件,它是来自您 VM 的堆数据。像“Memory Analyser Tool”这样的工具可以打开 hprof,您可以深入了解正在发生的事情(在内存方面)。 如果您的 VM 由于 OutOfMemory 而崩溃,您还可以设置参数以在事件发生时获取 hprof。它有助于理解原因(用户太多,数据库查询获取太多数据......)

最后一件事是您可以在启动 VM 时添加调试选项,以便您可以连接到它,并对 运行 进程进行调试。如果您有一些无法在本地环境中重现的奇怪问题,它会有所帮助。