我们都知道Core Dumps是分析Unix中各种进程的重要诊断工具。我知道jstack和gcore都用于生成Javacore文件或Core Dumps但我怀疑Gcore主要用于进程而Jstack用于线程。
从操作系统的角度来看,虽然流程和线程是相互关联的(流程仅包含线程),但它们在内存/速度/执行方面彼此相对不同。那么gcore将诊断进程并且jstack将分析该进程中的线程???
答案 0 :(得分:0)
GCore在操作系统级别执行,您获得了当前正在运行的本机代码的转储。从Java的角度来看,它并不是真的可以理解。
JStack为您提供应用程序所有线程的VM级别(Java堆栈)的堆栈跟踪。你可以从中发现什么是在某一点上执行的真正的java代码。
显然,GCore几乎从不使用(太低级别,本机代码......)。只有真正奇怪的问题与本机库或类似的东西可能需要这种工具。
还有一个jmap可以生成一个hprof文件,它是来自VM的堆数据。像“Memory Analyser Tool”这样的工具可以打开hprof,你可以深入了解正在发生的事情(在内存方面)。 如果您的VM因OutOfMemory而崩溃,您还可以设置参数以在事件发生时获取hprof。它有助于理解为什么(太多用户,数据库查询获取太多数据......)
最后一件事是,您可以在启动VM时添加调试选项,以便可以连接到它,并将调试放在正在运行的进程上。如果您遇到一些您无法在本地环境中重现的奇怪问题,它会有所帮助。