我们都知道核心转储是分析Unix中各种进程的基本诊断工具。我知道jstack和gcore都用于生成Javacore文件或核心转储,但我怀疑Gcore主要用于进程,而Jstack主要用于线程。
从操作系统的角度来看,进程和线程虽然是相互关联的(进程只由线程组成),但它们在内存/速度/执行方面是相对不同的。那么gcore将诊断进程而jstack将分析该进程中的线程吗?
发布于 2017-08-11 22:32:54
GCore在操作系统级别执行操作,您会得到当前正在运行的本机代码的转储。从java的角度来看,这并不是真正可以理解的。
JStack为您提供应用程序拥有的所有线程在VM级( java堆栈)的堆栈跟踪。您可以从中发现在某一时刻执行的真正java代码。
显然,GCore几乎从未使用过(级别太低,原生代码...)。只有本地库或类似的东西的问题才真正奇怪,可能需要这种工具。
还有一个jmap可以生成一个hprof文件,它是来自你的虚拟机的堆数据。像'Memory Analyser Tool‘这样的工具可以打开hprof,你可以深入了解(在内存端)发生了什么。如果您的VM由于OutOfMemory而崩溃,您还可以设置参数来获取事件发生时的hprof。它有助于理解原因(太多用户,获取太多数据的数据库查询...)
最后一件事是,您可以在启动VM时添加调试选项,以便您可以连接到它,并在运行的进程上进行调试。如果您有一些无法在本地环境中重现的奇怪问题,它会有所帮助。
https://stackoverflow.com/questions/45412158
复制相似问题