帮助我理解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
代理,它将显示所有CompiledMethodLoad
和DynamicCodeGenerated
事件,以及其他一些jvmti事件。