Qemu user-emulation with Java
我正在使用 QEMU 模拟器来跟踪用户程序的执行。我们添加了一个辅助函数,它打印所有执行指令的 IP。我们已经测试了该工具在两种质数程序变体中的工作情况——一种是 C 语言,另一种是 Java 语言。我们为每个程序尝试了 4 个不同的输入参数,期望在每种??情况下执行不同数量的指令。 C 版本的质数程序遵循预期的线性趋势,即行数随着输入的增加而增加。但是,Java 程序每次给出完全相同数量的指令。
我觉得 Java 执行跟踪只捕获 JVM 代码,而不是正在运行的实际代码。
JVM修改的代码会在QEMU上运行在哪里? QEMU 是否有任何特殊的方式来捕获自修改代码的执行?
Hotspot JVM(您可能正在使用的那个)有两种执行 java 代码的模式:解释和编译。当您启动程序时,它将首先以解释模式运行。如果 JVM 决定一个代码块被执行得足够频繁,它将编译它并使用编译后的代码。
所以你应该看到执行指令的数量呈线性趋势,但是只要JVM运行在解释模式下,你只会看到来自解释器的指令,因为没有与java代码对应的字节码。
您知道 x86 CPU 的性能计数器吗?它们可用于在不使用任何虚拟机的情况下测量指令数量。 https://perf.wiki.kernel.org/index.php/Main_Page