【问题标题】:What does certain JVM do after loading ByteCode into memory?某些JVM在将ByteCode加载到内存后会做什么?
【发布时间】:2013-10-18 20:16:42
【问题描述】:

例如像 HotSpot.. 我停止了它的编译模式,我正在考虑类的字节码 应该由opcode 礼物在内存中..

但似乎我错了..所以一些专家告诉我应该有一些 将字节码加载到内存时的转换过程..

任何机构都可以就这个问题给我更多说明吗...?

非常感谢!

【问题讨论】:

  • 您在 Hotspot 开发者邮件列表中的运气可能会更好。

标签: jvm bytecode


【解决方案1】:

您可以通过查看强制 JVM 将内部表示转换回官方类文件格式的 API 文档来获得一些提示:

http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/Instrumentation.html#retransformClasses(java.lang.Class...)

初始类文件字节表示传递给 ClassLoader.defineClass 或 redefineClasses 的字节(在应用任何转换之前),但它们可能不完全匹配。常量池可能没有相同的布局或内容。常量池可能有更多或更少的条目。常量池条目可能有不同的顺序;但是,方法字节码中的常量池索引将对应。某些属性可能不存在。如果顺序没有意义,例如方法的顺序,可能不会保留顺序

从本文档中,您可以得出结论,您可以预期访问常量池的指令看起来不同,至少它们可能具有不同的索引,并且您不能假设方法被放置在连续的内存空间中。这并不意味着这些是唯一的转换,但如果需要,所有其他转换都可以反转——至少在支持 Instrumentation 的 JVM 中是这样。


在运行代码时,JVM 可能会用专门的 VM 内部指令替换指令,以优化进一步的执行。如果您好奇 JVM 可能有什么样的指令,您可以使用参数运行 Oracle 的 HotSpot-Engine

-XX:+UnlockDiagnosticVMOptions-XX:+PrintInterpreter

然后它将打印解释器使用的所有指令及其相关本机代码的表。该表必然包含这些专门的指令。例如。在我的机器和 jdk 1.7 上,我看到大约 30 条非标准字节码指令,范围为 203 到 231。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多