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