2014-02-22 129 views
0

我将尝试通过online document for jstack在那里说要了解java命令jstack:Java线程对于给定的Java 进程或核心什么是jstack命令帧

jstack打印的Java堆栈跟踪文件或远程调试服务器。对于每个Java框架,打印完整的类名称,方法名称,'bci'(字节代码索引)和 号码(如果可用),则为 。使用-m选项,jstack将打印 所有线程的Java和本机帧以及'pc' (程序计数器)。对于每个本地帧,打印出最接近 'pc'的本机符号(如果可用)。 C++ mangled名称不会被取消。 要取消C++名称的命名,可以将此命令的输出传送至 C++ filt。

我有些疑惑,请帮我理解这个命令。

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

2)这个上下文中的Java Frame是什么?线程的本地框架是什么?

3)当我学习微处理器时,我已经了解了有关程序计数器的知识,但是它也是与Java相同的概念应用程序吗?

4)最接近原生符号到PC的含义是什么?另外,在Java中如何使用C++,我在学习Java时从来没有遇到过C++。

请澄清,在此先感谢。

+1

“框架”是一个“堆栈框架”是分配的存储器来表示调用方法的实例。它包含参数,方法的局部变量,返回地址等。“native frame”显然是为本地方法(与Java方法)分配的堆栈帧。 –

回答

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

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

  3. Java虚拟机也是一台机器,它有一个程序计数器。这不是你可以用手触碰或洒咖啡的东西。

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

+0

非常感谢您的澄清。所以这意味着文件说C/C++是本机代码?你能告诉我什么是本地的意思,为什么它需要在Java中?这可能是一个简单的问题,但请帮助我理解。 – Chaitanya

+0

是的,“本地代码”通常是用C或C++编写的,JVM本身就是本地代码(也可以通过JNI执行用户提供的本机代码)。这是因为JVM只是一个*虚拟*机器,所以需要在某个地方实施! –