2011-06-03 65 views
1

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

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

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

回答

5

您将需要一个堆栈每个线程,并与每MethodEnter你推堆栈上的时间戳和MethodExit你弹出的时间戳和计算差值为当前时间。

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

+0

谢谢,这是一个非常有用的答案。使用这种测量时间的方法对我来说是众所周知的,这完全没问题。我可能会放弃显示时间,但只显示与所有其他执行相比的总体百分比。 – 2011-06-03 16:38:23