使用JVMTI测量方法执行

时间:2011-06-03 15:26:27

标签: java jvmti

使用JVMTI提供的MethodEntryMethodExit事件挂钩,如何衡量在Java中执行的方法的时间?

简单来说就是:time2 - time1但是我看到的问题是,如何区分不同的方法?有一个methodID,但递归调用呢?方法在打开后何时关闭?

我应该比较堆栈跟踪吗?什么是有意义的数据结构来跟踪输入的方法?像Map<StackTrace,Time>?

这样的东西

1 个答案:

答案 0 :(得分:5)

每个线程都需要一个堆栈,并且每个MethodEnter都会在堆栈上按下时间戳,在MethodExit上弹出时间戳并计算当前时间的差值。

虽然您应该记住,阅读时间戳或刻度线以及周围的逻辑相对耗时。如果你在某种类型的分析器中使用这样的东西,你会得到一些结果,使得小的快速方法显得非常昂贵。即ByteBuffer.get()的执行速度可能比测量代码快至少10倍。当JVMTI处于活动状态时,由于有限的JIT编译导致的失真,这些方法在收集的数据中很容易出现比正常情况下重100倍的方法。获得方法的执行时间份额有些可用数据的唯一方法是使用抽样。