【发布时间】:2023-08-01 18:24:01
【问题描述】:
我在运行时为各种目的检测类文件。为此,我正在使用 JVMTI 代理。我检测方法的策略是调用RetransformClasses 函数来调用ClassFileLoadHook。此策略适用于在检测之后有任何进一步调用的所有方法,因为实际检测发生在后续函数调用中,但它不适用于任何没有进一步调用的方法,如程序中的 main 函数.
我想在执行过程中动态检测方法。我想要一些程序,例如检测代码的堆栈替换(OSR)。 JVMTI中是否有任何可用的策略或任何其他方法????
PS:如果有帮助,我愿意编辑/修补 OpenJDK 源代码。
【问题讨论】:
-
我不明白的是:考虑到这样的方法将永远被调用;检测它有什么意义?我的意思是:当稍后调用该方法时,仪器不是为您提供“洞察力”吗?比如调用方法的时候?
-
就分析仪器而言,您是正确的。我正在检测我的代码以在方法中并行化长时间运行的循环。因此,如果您的
main中有一个繁琐的循环,我想对其进行检测以生成一些线程并加入它们(如果它是可并行化的当然)。这就是为什么我遇到了检测单个调用函数的原因。 -
你看过javaagent吗?
-
@DennisC 是的。我从 Javaagent 开始。我试过 ASM 和 Javassist。 Javagent 在其后端也使用相同的策略。对于动态运行时检测,它会做同样的事情。也就是说,如果有任何后续调用,则检测后续调用。
-
顺便说一句。不要太相信 OSR。每次发布新的 jdk 时,我阅读 lucene 项目通常都会发现由于 OSR 和优化器导致的热点中的一些错误。
标签: java jit instrumentation jvm-hotspot jvmti