【问题标题】:Where does the HotSpot JVM store interpreted bytecode?HotSpot JVM 在哪里存储解释的字节码?
【发布时间】:2020-10-28 04:09:57
【问题描述】:

我一直想知道方法的解释字节码在 JVM 内部存储在哪里(特别是 HotSpot x64)。我知道 JIT-ed 的方法被存储并且可以在 Method 结构中访问,但我试图了解 JVM 在哪里存储转换为汇编指令的字节码(我假设它存储它们,否则会有解释每次调用都会占用大量内存),因为我无法在内部源代码中找到它。

【问题讨论】:

    标签: java jvm jit jvm-hotspot


    【解决方案1】:

    解释字节码并不像您想象的那么昂贵。为什么 JVM 会花时间为运行一次的代码生成机器代码?最好等到某个方法或块达到 JIT 阈值,然后然后花时间启用跟踪 JIT。

    src/share/vm/interpreter 子目录似乎就是您所追求的:

    • bytecodeInterpreter.cpp实现实际栈机;
    • bytecodes.cpp 定义了每个操作码的形状和属性。
    • bytecodes.h 声明所有字节码。
    • templateTable.cpp 包含将 JVM 操作码映射到程序集的机制。
    • cpu/*/vm/templateTable*.cpp 包含为给定 CPU 生成程序集 sn-ps 的实际代码。

    【讨论】:

    • 也许你可以指出JVM在哪里执行方法的解释字节码?因为那是我更感兴趣的发现。
    • 另一个问题:JVM 是否有地方存储方法的解释字节码的组装?
    • 也许你应该自己挖掘一下。猜测一下,我会开始查看 Method 的(子类)。
    • @aruhn 解释器不存储汇编指令。编译器可以。这就是解释器和编译器的根本区别。
    • 重读问题,我发现您误解了我的回答。解释器不存储任何程序集,它只是解释操作码并修改堆栈和堆。
    猜你喜欢
    • 1970-01-01
    • 2016-06-01
    • 2013-08-01
    • 2013-08-28
    • 2011-04-11
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2011-08-02
    相关资源
    最近更新 更多