JVMTI_EVENT_COMPILED_METHOD_*和JVMTI_VENT_DDYNAMIC_CODE_GENER



帮助我理解OpenJDK 8的JVMTI_EVENT_COMPILED_METHOD_*和JVMTI_VENT_DYNAMIC_CODE_GENERATED之间的区别。
我在Grafana对这些事件进行了可视化计数,但最终没有理解它们。

也许是";口译员";以及";C2/C1";或者其他什么
你能解释一下这件事是什么时候发生的吗

我读过https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html#CompiledMethodLoad但我仍然无法理解差异
谢谢。

CompiledMethodLoad事件对应于Java方法的JIT编译

DynamicCodeGenerated事件是在JVM为非Java方法生成代码时发送的:各种运行时存根、处理程序、适配器等。HotSpot中的字节码解释器也是在VM启动时动态生成的,因此在生成解释器时发送相同的事件。

发送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引导过程中生成的,或者是根据VM运行时函数的要求生成的。

试试jvmti工具中的vmtrace代理,它将显示所有CompiledMethodLoadDynamicCodeGenerated事件,以及其他一些jvmti事件。

最新更新