Unix 生成核心转储时Jstack和gcore之间的差异?
我们都知道,内核转储是分析Unix中各种进程的基本诊断工具。我知道jstack和gcore都用于生成Javacore文件或核心转储,但我怀疑gcore主要用于进程,而jstack用于线程Unix 生成核心转储时Jstack和gcore之间的差异?,unix,process,operating-system,java-threads,Unix,Process,Operating System,Java Threads,我们都知道,内核转储是分析Unix中各种进程的基本诊断工具。我知道jstack和gcore都用于生成Javacore文件或核心转储,但我怀疑gcore主要用于进程,而jstack用于线程 从操作系统的角度来看,进程和线程虽然相互关联(进程仅由线程组成),但它们彼此相对不同—内存/速度/执行。因此,gcore将诊断该进程,jstack将分析该进程中的线程???gcore在操作系统级别执行操作,您得到了当前正在运行的本地代码转储。从java的角度来看,这是不可理解的 JStack在VM级别(java
从操作系统的角度来看,进程和线程虽然相互关联(进程仅由线程组成),但它们彼此相对不同—内存/速度/执行。因此,gcore将诊断该进程,jstack将分析该进程中的线程???gcore在操作系统级别执行操作,您得到了当前正在运行的本地代码转储。从java的角度来看,这是不可理解的 JStack在VM级别(java堆栈)获取应用程序所有线程的堆栈跟踪。您可以从中找到在某一点上执行的真正java代码 显然,GCore几乎从未被使用过(级别太低,本机代码…)。只有当本机库或类似的东西出现真正奇怪的问题时,才可能需要这种工具 还有jmap可以生成hprof文件,该文件是来自VM的堆数据。像“”这样的工具可以打开hprof,您可以深入了解发生了什么(在内存端)。 如果您的VM由于OutOfMemory而崩溃,您还可以设置参数以在事件发生时获取hprof。这有助于理解原因(用户太多,数据库查询获取太多数据…)
最后一件事是,您可以在启动VM时添加一个调试选项,这样您就可以连接到它,并将调试放在正在运行的进程上。如果您遇到一些无法在本地环境中重现的奇怪问题,它会有所帮助。从上面的内容可以看出,gcore对于核心转储非常有用,而Jstack用于线程转储。在链接中可以找到两者之间的差异。