我不了解 Sun JVM,但是当您请求 MethodEntry/Exit 事件时,IBM JVM 会进入我们所说的 FullSpeedDebug 模式...... FSD 会大大减慢执行速度。
正如您所说,您可以像我的分析器那样使用 BCI,但除非您对检测哪些方法有选择性,否则您也会看到速度变慢。例如,我的分析器在每个条目上插入一个 if(profiling) callProfilerHook(),并在所有对象创建的方法中以及其他一些区域中的所有可能的退出中插入一个...。这些额外的检查可能会使执行速度减慢 50% 以上。 ..
至于如何进行 BCI ......好吧,我编写了自己的 C 库来做到这一点......从技术上讲并不难(提示只需删除 StackMapTable),但我可能需要你一段时间......或者你可以使用 ASM et。人。
最后......你 callBackHook 将增加开销,并且在小方法上呈现报告的 CPU/时钟时间毫无意义,除非你执行一些复杂的开销计算......即使你这样做,你的回调代码也会影响处理器 L1 缓存和 Java 的形状代码变得不那么高效,因为它有更少的空间..
我的分析器基本上忽略了报告的时间,因为我以一种有趣的方式可视化执行......我希望了解所有代码的流程,事实上在大多数情况下,什么代码正在运行(大多数 Java 项目不知道在他们的应用程序中运行的数百万行第三方代码)