如何在Java中解释-XX:CompileCommand =“ print Class :: Method”的输出

Che*_*anc 3 java jvm-hotspot java-opts java-8

这是我运行以下命令时得到的输出的摘录(40只是Fibonacci程序的arg):

java -XX:+ UnlockDiagnosticVMOptions -XX:CompileCommand =“ print Fibonacci :: fibonacci” Fibonacci 40

有人可以解释每个数据的含义吗(我想这意味着字节数,例如,主代码需要288字节)。另外,各种类别是什么意思-重定位,存根代码,元数据,范围数据,范围pc,处理程序表等是什么意思?

...
Compiled method (c2)      93   16       4       Fibonacci::fibonacci (22 bytes)
total in heap  [0xfff8000108113dd0,0xfff8000108114440] = 1648
relocation     [0xfff8000108113f00,0xfff8000108113f48] = 72
main code      [0xfff8000108113f60,0xfff8000108114080] = 288
stub code      [0xfff8000108114080,0xfff80001081141e0] = 352
oops           [0xfff80001081141e0,0xfff80001081141e8] = 8
metadata       [0xfff80001081141e8,0xfff8000108114210] = 40
scopes data    [0xfff8000108114210,0xfff8000108114298] = 136
scopes pcs     [0xfff8000108114298,0xfff80001081143d8] = 320
dependencies   [0xfff80001081143d8,0xfff80001081143e0] = 8
handler table  [0xfff80001081143e0,0xfff8000108114440] = 96
----------------------------------------------------------------------
Fibonacci.fibonacci  [0xfff8000108113f60, 0xfff80001081141e0]  640 bytes
[Entry Point]
[Verified Entry Point]
[Constants]
# {method} {0xfff80001036243b8} 'fibonacci' '(I)J' in 'Fibonacci'
# parm0:    I0        = int
#           [sp+0x90]  (sp of caller)
...
Run Code Online (Sandbox Code Playgroud)

Gil*_* D. 6

方括号之间的十六进制数字是包含数据的内存范围的开始和结束。如您所料,后面的数字=是数据大小(以字节为单位)。

关于类别:

  • total in heap是整个编译后的代码和元数据。它包括所有其他类别。它实际上大于所有其他类别的总和,因为此表中未描述一堆其他字段(此表仅描述对象中具有可变大小的部分)。
  • relocation是允许VM在必要时修补代码的元数据:例如,如果代码嵌入对象指针,则如果GC移动对象,则需要修改该指针。它还包含有关内联缓存,对外部常量的任何引用,运行时调用等信息。
  • main code 是为该方法编译的大量本机代码。
  • stub code这是与此方法相关的更多机器代码。它通常是一小段代码,用于在某些运行时事件(例如,链接或重新链接调用站点或内联缓存,取消优化,异常处理等)期间支持主代码。
  • oops普通对象指针的数组(即,指向垃圾收集对象的指针)。可以从主代码或scopes data下面的代码中引用它们。
  • metadata自从JDK 8中删除永久生成以来,VM的有关类和方法的元数据不再是标准的垃圾收集操作,因为仍然需要对其进行跟踪,因此它们具有自己的部分。metadata指向元数据对象(例如,VM对象表示类和方法)的指针也是如此。也可以从主代码或scopes data以下代码中引用它们。
  • scopes pcs它包含允许从主要本机代码中的程序计数器到Java中代码位置的元数据:本机PC映射到Java方法和字节码索引(“ bci”)。由于内联,单个PC实际上与(方法,bci)对的堆栈相关联。
  • scopes data它包含进一步描述这些PC上Java VM状态的元数据。它包含将JVM位置(例如本地或堆栈插槽)映射到本地位置(例如寄存器或本地堆栈插槽)的数据。这使VM可以知道在GC期间要在哪里查找oop,以及在取消优化期间可以重建解释器的状态。
  • dependencies这是编译器在编译此方法时所做的“假设”列表。这样的假设可以是“ Foo类没有子类”。这样,如果以后发生违反该假设的情况(例如,加载一个新类,该类是上一个示例中Foo的子类),VM便可以知道该方法需要无效。
  • handler table 该表可让VM知道由于异常而在展开时从何处继续执行。