2

对于我使用JVMTI实现的分析器,我想开始测量所有 Java 方法的执行时间。JVMTI 提供以下事件:

  • MethodEntry
  • MethodExit

所以这很容易实现,但是我在 API 中遇到了这个注释:

启用方法进入或退出事件将显着降低许多平台上的性能,因此不建议将其用于性能关键用途(例如分析)。在这些情况下应该使用字节码检测。

但是我的分析代理无头工作,这意味着收集的数据被序列化并通过套接字发送到显示结果的服务器应用程序。我应该如何使用字节码检测来实现这一点。我有点困惑如何从这里继续。有人可以向我解释一下,如果我必须改变策略或者我该如何解决这个问题?

4

1 回答 1

1

我不了解 Sun JVM,但是当您请求 MethodEntry/Exit 事件时,IBM JVM 会进入我们所说的 FullSpeedDebug 模式...... FSD 会大大减慢执行速度。

正如您所说,您可以像我的分析器那样使用 BCI,但除非您对检测哪些方法有选择性,否则您也会看到速度变慢。例如,我的分析器在每个条目上插入一个 if(profiling) callProfilerHook(),并在所有对象创建的方法中以及其他一些区域中的所有可能的退出中插入一个...。这些额外的检查可能会使执行速度减慢 50% 以上。 ..

至于如何进行 BCI ......好吧,我编写了自己的 C 库来做到这一点......从技术上讲并不难(提示只需删除 StackMapTable),但我可能需要你一段时间......或者你可以使用 ASM et。人。

最后......你 callBackHook 将增加开销,并且在小方法上呈现报告的 CPU/时钟时间毫无意义,除非你执行一些复杂的开销计算......即使你这样做,你的回调代码也会影响处理器 L1 缓存和 Java 的形状代码变得不那么高效,因为它有更少的空间..

我的分析器基本上忽略了报告的时间,因为我以一种有趣的方式可视化执行......我希望了解所有代码的流程,事实上在大多数情况下,什么代码正在运行(大多数 Java 项目不知道在他们的应用程序中运行的数百万行第三方代码)

于 2011-05-11T11:34:14.470 回答