有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用JVMTI测量Java的执行时间

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

  • MethodEntry
  • MethodExit

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

Enabling method entry or exit events will significantly degrade performance on many platforms and is thus not advised for performance critical usage (such as profiling). Bytecode instrumentation should be used in these cases.

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


共 (1) 个答案

  1. # 1 楼答案

    我不知道Sun JVM的情况,但当您请求MethodEntry/Exit事件时,IBM JVM将进入我们称之为FullSpeedDebug的模式。。。。消防处的执行速度慢了不少

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

    至于如何使用BCI。。。我写了我自己的C库来做这件事。。。这在技术上并不难(提示删除StackMapTable即可),但我可能需要您一段时间。。或者,您可以使用ASM等

    最后。。。callBackHook会增加开销,在小方法中,报告的CPU/时钟时间将变得毫无意义,除非执行一些复杂的开销计算。。。即使这样做,回调代码也会影响处理器L1缓存的形状,Java代码的效率也会降低,因为它的空间更小

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