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


MethodEntry
MethodExit


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


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


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

最佳答案

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

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

至于如何BCI ...好吧,我写了我自己的C库来做...在技术上并不困难(仅删除StackMapTable就可以了,但是我可能要花点时间。)或者,您也可以使用ASM等。等

最后... callBackHook会增加开销,并且在小型方法上使报告的CPU /时钟时间变得毫无意义,除非您执行一些复杂的开销计算...即使执行此操作,您的回调代码也会影响处理器L1缓存和Java的形状代码的效率降低,因为它的空间较小。

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

关于java - 使用JVMTI测量Java的执行时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5962923/

10-14 12:51
查看更多