JVMTI_EVENT_COMPILED_METHOD_* 和 JVMTI_EVENT_DYNAMIC_CODE_GENERATED 有什么区别?
What is diff between JVMTI_EVENT_COMPILED_METHOD_* and JVMTI_EVENT_DYNAMIC_CODE_GENERATED?
帮助我了解 OpenJDK 8 的 JVMTI_EVENT_COMPILED_METHOD_* 和 JVMTI_EVENT_DYNAMIC_CODE_GENERATED 之间的区别。
我在 Grafana 中计算这些事件以进行可视化,但到最后还是不理解它们。
可能是“Interpretator”和“C2/C1”之类的东西。
你能解释一下这个事件是什么时候发生的吗?
我读过 https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html#CompiledMethodLoad 但我仍然无法理解不同之处。
谢谢
CompiledMethodLoad
事件对应于 Java 方法的 JIT 编译.
DynamicCodeGenerated
当 JVM 为非 Java 方法生成代码时发送事件:各种运行时存根、处理程序、适配器等。 HotSpot 中的字节码解释器也是在 VM 启动时动态生成的,因此在生成解释器时发送相同的事件。
代码 blob 的一些示例,为此发送了 DynamicCodeGenerated
事件:
Interpreter
flush_icache_stub
DeoptimizationBlob
I2C/C2I adapters
AbstractMethodError throw_exception
jlong_disjoint_arraycopy
slow_subtype_check Runtime1 stub
itable stub
- 等等
JIT 编译器线程不参与这些 blob 的生成。这些代码块是在 VM bootstrap 期间生成的,或者是根据 VM 运行时函数的需要生成的。
尝试 jvmti-tools 中的 vmtrace
代理 - 它会向您显示所有 CompiledMethodLoad
和 DynamicCodeGenerated
事件,以及其他一些 JVM TI 事件。
帮助我了解 OpenJDK 8 的 JVMTI_EVENT_COMPILED_METHOD_* 和 JVMTI_EVENT_DYNAMIC_CODE_GENERATED 之间的区别。
我在 Grafana 中计算这些事件以进行可视化,但到最后还是不理解它们。
可能是“Interpretator”和“C2/C1”之类的东西。
你能解释一下这个事件是什么时候发生的吗?
我读过 https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html#CompiledMethodLoad 但我仍然无法理解不同之处。
谢谢
CompiledMethodLoad
事件对应于 Java 方法的 JIT 编译.
DynamicCodeGenerated
当 JVM 为非 Java 方法生成代码时发送事件:各种运行时存根、处理程序、适配器等。 HotSpot 中的字节码解释器也是在 VM 启动时动态生成的,因此在生成解释器时发送相同的事件。
代码 blob 的一些示例,为此发送了 DynamicCodeGenerated
事件:
Interpreter
flush_icache_stub
DeoptimizationBlob
I2C/C2I adapters
AbstractMethodError throw_exception
jlong_disjoint_arraycopy
slow_subtype_check Runtime1 stub
itable stub
- 等等
JIT 编译器线程不参与这些 blob 的生成。这些代码块是在 VM bootstrap 期间生成的,或者是根据 VM 运行时函数的需要生成的。
尝试 jvmti-tools 中的 vmtrace
代理 - 它会向您显示所有 CompiledMethodLoad
和 DynamicCodeGenerated
事件,以及其他一些 JVM TI 事件。