【问题标题】:Measuring method execution with JVMTI使用 JVMTI 测量方法执行
【发布时间】:2011-06-03 15:26:26
【问题描述】:

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

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

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

【问题讨论】:

    标签: java jvmti


    【解决方案1】:

    每个线程都需要一个堆栈,每个MethodEnter 将时间戳压入堆栈,MethodExit 弹出时间戳并计算与当前时间的差异。

    尽管您应该记住,读取时间戳或滴答计数以及周围的逻辑比较耗时。如果您在某种分析器中使用类似的东西,您将获得使小型快速方法显得非常昂贵的结果。 IE。 ByteBuffer.get() 的执行速度可能比您的测量代码快至少 10 倍。再加上在 JVMTI 处于活动状态时由于有限的 JIT 编译而导致的失真,这些方法在收集的数据中很容易出现比正常情况下重 100 倍的情况。获得方法执行时间份额的一些有用数据的唯一方法是使用采样。

    【讨论】:

    • 谢谢,这是一个非常有用的答案。使用这种测量时间的方法的影响我是众所周知的,而且完全没问题。我可能会停下来显示时间,但只显示与所有其他执行相比的总体百分比。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    相关资源
    最近更新 更多