我试图通过online document for jstack来解释java命令jstack
:
jstack打印给定Java的Java线程的Java堆栈跟踪 进程或核心文件或远程调试服务器。对于每个Java框架, 完整的类名,方法名,'bci'(字节码索引)和行 数字(如果有)打印。使用-m选项,jstack打印 所有线程的Java和本机帧以及'pc' (程序计数器)。对于每个本机帧,最接近的本机符号 打印出“pc”(如果有)。 C ++错位的名称不是demangled。 要解压缩C ++名称,可以将此命令的输出通过管道传递给 C ++ FILT。
我有些疑惑,请帮助我理解这个命令。
1)核心文件是我想要打印堆栈跟踪的文件的名称还是它 不同?什么是远程调试服务器,我们如何使用它或配置?
2)在此上下文中什么是Java Frame以及什么是线程的本机框架?
3)我在学习微处理器的过程中学到了很多关于程序计数器的知识,但是同样也是Java的概念应用程序?
4)最近的本机符号到pc是什么意思?另外在Java中如何使用c ++,在学习Java时我从未遇到过c ++。
请澄清,提前致谢。
答案 0 :(得分:2)
核心文件是正在运行(或以前运行的)Java程序的核心转储,通常是在崩溃或者您将其杀死之后。 jstack
可以附加到正在运行的程序,也可以从核心转储中读取。
帧是与函数调用关联的状态。每次调用函数时,都会有一个包含该函数本地状态的新框架(例如局部变量)。帧形成一个堆栈:调用一个函数将一个新帧推入堆栈,然后从一个函数返回,将该帧从堆栈中弹出,然后继续在下面的帧中,该帧属于调用者。顶部框架保存程序的当前执行点可直接访问的数据。从概念上讲,框架类似于块结构编程语言中的“范围”。
Java虚拟机也是一台机器,它有一个程序计数器。这不是你可以用手触摸或将咖啡洒在上面的。
由于JVM是虚拟的,它实际上是由真实的机器代码执行的,称为“本机”。因此,您对本机代码的帧和函数调用以及执行点也有相同的全部考虑。