以下是我运行以下命令时得到的输出的摘录(40只是斐波那契程序的一个参数):
java -XX:+ UnlockDiagnosticVMOptions -XX:CompileCommand =" print Fibonacci :: fibonacci"斐波那契40
有人可以解释每个数据的含义(我认为它意味着字节数,例如,主代码需要288个字节)。此外,各种类别意味着什么 - 重定位,存根代码,元数据,范围数据,范围pcs,处理程序表等意味着什么?
/dev/tty
答案 0 :(得分:5)
方括号之间的十六进制数字是包含数据的内存范围的开头和结尾。正如您猜测的那样,=
之后的数字是以字节为单位的数据大小。
关于类别:
total in heap
是整个编译的代码和元数据。它包括所有其他类别。它实际上大于所有其他类别的总和,因为此表中未描述了许多其他字段(此表仅描述了具有可变大小的对象部分)。relocation
是允许VM在必要时修补代码的元数据:例如,如果代码嵌入了对象指针,则在GC移动对象时需要修改该指针。它还包含有关内联高速缓存的信息,对外部常量的任何引用,运行时调用等。main code
是为该方法编译的大部分本机代码。stub code
这是与此方法相关的更多机器代码。通常在一些运行时事件期间用于支持主代码的小代码片段(例如,链接或重新链接调用站点或内联缓存,去优化,异常处理......)oops
一组普通对象指针(即指向垃圾收集对象的指针)。可以从主代码或下面的scopes data
引用它们。metadata
由于在JDK 8中删除了永久生成,因此VM关于类和方法的元数据不再是标准的垃圾收集oops,因为它们仍然需要被跟踪它们有自己的部分。所以metadata
是指向元数据对象的指针(例如,表示类和方法的VM对象)。它们也可以从主代码或下面的scopes data
引用。scopes pcs
这包含允许从主本机代码中的程序计数器转到Java中的代码位置的元数据:本机PC映射到Java方法和字节码索引(" bci&#34 )。由于内联,单个PC实际上与一堆(方法,bci)对相关联。scopes data
这包含进一步描述这些PC上Java VM状态的元数据。它包含将JVM位置(例如,本地或堆栈槽)映射到本机位置(例如,寄存器或本机堆栈槽)的数据。这允许VM在GC期间知道在哪里寻找oops以及在去优化期间重建解释器的状态。dependencies
这是一个"假设列表"编译此方法时编译器。这样的假设可能是" Foo类没有子类"。这允许VM知道如果某些事情违反了这个假设(例如在前面的例子中加载一个新类,它是Foo的子类),则该方法需要被无效。handler table
这是一个允许VM知道因异常而展开时继续执行的表。