对于我使用JVMTI实现的分析器,我想开始测量所有Java方法的执行时间。 JVMTI提供了以下活动:
MethodEntry
MethodExit
所以这很容易实现,但我在API中遇到了这个note:
启用方法进入或退出事件将显着降低许多平台上的性能,因此不建议用于性能关键用途(例如性能分析)。在这些情况下应使用字节码仪器。
但是我的分析代理工作无头,这意味着收集的数据被序列化并通过套接字发送到显示结果的服务器应用程序。我应该如何使用字节码检测来实现这一点。我有点困惑如何继续从这里开始。有人可以向我解释,如果我必须改变策略或者我该如何处理这个问题?
答案 0 :(得分:1)
我不了解Sun JVM,但是当您请求MethodEntry / Exit事件时,IBM JVM进入我们称之为FullSpeedDebug模式的行为.... FSD会使执行速度降低很多。
正如你所说,你可以使用BCI作为我的探查器,但除非你选择使用哪种方法,否则你也会看到减速。例如,我的探查器在每个条目上插入一个if(profiling)callProfilerHook(),并在所有对象创建的方法中创建所有可能的出口以及其他一些区域....这些额外的检查可以使执行速度降低50%以上。 ..
关于如何BCI ......好吧我编写了自己的C库来做它...技术上并不难(提示只是删除StackMapTable)但我可能会花一些时间...或者你可以使用ASM et 。人
最后......你callBackHook会增加开销,并且在小方法上渲染报告的CPU /时钟时间毫无意义,除非你执行一些复杂的开销计算...即使你这样做,你的回调代码会影响处理器L1缓存的形状并且Java代码效率降低,因为它的空间较小..
我的探查器基本上忽略了报告的时间,因为我以一种有趣的方式可视化执行......我希望了解所有代码的流程,事实上在大多数情况下代码正在运行(大多数Java项目都有不知道他们的应用程序中运行的第三方代码数百万的数量)