使用JVMTI提供的MethodEntry和MethodExit事件挂钩,我如何测量在Java中执行的方法的时间?
简单的说法就是:time2 - time1但我看到的问题是,如何区分不同的方法?有一个methodID,但递归调用呢?打开后方法何时关闭?
我应该比较堆栈跟踪吗?什么是有意义的数据结构来跟踪输入的方法?就像是Map<StackTrace,Time>?
每个线程都需要一个堆栈,并且每次MethodEnter按下堆栈上MethodExit的时间戳,然后弹出时间戳并计算当前时间的差值.
虽然您应该记住,读取时间戳或刻度线以及周围的逻辑相对耗时.如果你在某种类型的分析器中使用这样的东西,你会得到一些结果,使得小的快速方法显得非常昂贵.即,a的ByteBuffer.get()执行速度至少比测量代码快10倍.当JVMTI处于活动状态时,由于有限的JIT编译导致的失真,这些方法在收集的数据中很容易出现比正常情况下重100倍的方法.获得方法的执行时间份额的可用数据的唯一方法是使用抽样.