0

我试图jstack通过浏览 jstack 的在线文档来理解 java 命令,其中说:

jstack 为给定的 Java 进程或核心文件或远程调试服务器打印 Java 线程的 Java 堆栈跟踪。对于每个 Java 框架,将打印完整的类名、方法名、'bci'(字节码索引)和行号(如果有)。使用 -m 选项,jstack 会打印所有线程的 Java 和本机帧以及“pc”(程序计数器)。对于每个原生帧,如果可用,将打印最接近“pc”的原生符号。C++ 重整名称不会被重整。要对 C++ 名称进行解码,可以将此命令的输出通过管道传输到 c++filt。

我有一些疑问,请帮助我理解这个命令。

1)核心文件只是我要打印堆栈跟踪的文件的名称还是不同?什么是远程调试服务器,我们如何使用或配置它?

2) 在这种情况下,什么是 Java 框架,什么是线程的本机框架?

3)我之前在学习微处理器时了解了程序计数器,但是Java的概念应用程序也相同吗?

4) 最接近 pc 的本地符号是什么意思?还有如何在 Java 中使用 c++,我在学习 Java 时从未接触过 c++。

请澄清,提前谢谢。

4

1 回答 1

2
  1. 核心文件是正在运行(或以前正在运行)的 Java 程序的核心转储,通常在它崩溃或您杀死它之后。jstack可以附加到实时运行的程序,也可以从核心转储中读取。

  2. 框架是与函数调用相关的状态。每次调用函数时,都会有一个新框架包含该函数的局部状态(例如局部变量)。帧形成堆栈:调用函数会将新帧压入堆栈,从函数返回时会将该帧从堆栈中弹出,然后继续进入下面属于调用者的帧。顶部框架保存程序的当前执行点可以直接访问的数据。从概念上讲,帧类似于块结构编程语言中的“作用域”。

  3. Java 虚拟机也是一台机器,它有一个程序计数器。它不是您可以用手触摸或将咖啡洒在上面的东西。

  4. 因为JVM是虚拟的,所以实际上是由真实的机器代码执行的,称为“native”。因此,对于本机代码,您再次对帧和函数调用以及执行点有相同的考虑。

于 2014-02-22T12:39:58.627 回答