编程语言
首页 > 编程语言> > 如何在java中解释-XX:CompileCommand =“print Class :: Method”的输出

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

作者:互联网

以下是我运行以下命令时得到的输出的摘录(40只是斐波那契程序的一个参数):

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

有人可以解释每个数据的含义(我认为它意味着字节数,例如,主代码需要288个字节).此外,各种类别意味着什么 – 重定位,存根代码,元数据,范围数据,范围pcs,处理程序表等意味着什么?

...
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)
...

解决方法:

方括号之间的十六进制数字是包含数据的内存范围的开头和结尾.正如您猜测的那样,=之后的数字是以字节为单位的数据大小.

关于类别:

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

标签:java,java-8,jvm-hotspot,java-opts
来源: https://codeday.me/bug/20190828/1751669.html