【问题标题】:Java count individual bytecode instructions executedJava 计算执行的单个字节码指令
【发布时间】:2017-07-02 02:51:21
【问题描述】:

我正在尝试使用ASM 来计算在单个函数中执行的各个字节码指令以构建直方图。我看到有一个工具ByCounter 可以完成类似的任务——但我无权访问源代码。

我的理解是 Java asm 字节码库可以检测类、字段、方法,但是找不到检测单个字节码指令的示例(尽管来自 ByCounter——发现它是可能的)。

如果像 JVMTI 这样的工具更适合,那么这也是有用的信息!

感谢您的帮助!

【问题讨论】:

  • 您打算将这些信息用于什么目的?如果您正在尝试分析或优化程序,字节码并不是 JIT 最终会实际运行的 - 它会在运行时将整个事情重写为一些完全不同排列的本机代码。
  • 你不能访问一个方法的instructions 并检查size吗?
  • @LouisWasserman 我想看看在一个方法中沿着不同的代码路径执行了多少指令。我同意这是一种不完美的方法,但它是获得一些基线指标的开始。
  • @VinceEmigh 这对于静态分析来说是个好主意,但是对于动态分析来说这不是正确的吗?

标签: java bytecode instrumentation java-bytecode-asm


【解决方案1】:

这是我为Jawa 制作的那种愚蠢的东西。示例:

from collections import Counter
from jawa.cf import ClassFile
import pandas


with open('tests/data/HelloWorldDebug.class', 'rb') as fin:
    cf = ClassFile(fin)

    method = cf.methods.find_one(name='<init>')

    ins = Counter(i.mnemonic for i in method.code.disassemble())

    df = pandas.DataFrame.from_dict(ins, orient='index')
    fig = df.plot(kind='bar').get_figure()
    fig.savefig('example.png')

【讨论】:

  • 这似乎会生成方法中包含的指令的直方图,而不是实际执行的指令...
  • 你完全正确,这是我错过的一个关键词。未记录的 Context() 类可用于在普通 JVM 中运行该方法,但显然会给出与真正的 JVM 截然不同的结果。
  • @TkTech 不错的小直方图,谢谢分享。我想要一个直方图,而不是在前面提到的方法中运行时的字节码计数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 2022-01-03
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
相关资源
最近更新 更多