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 代理 - 它会向您显示所有 CompiledMethodLoadDynamicCodeGenerated 事件,以及其他一些 JVM TI 事件。