例如像HotSpot ..我停止了它的编译模式,我在想类的字节码应该由操作码呈现在内存中..
但是好像我错了。。所以有高手告诉我,在将字节码加载到内存的时候,应该有一些转换过程。。
任何机构都可以就这个问题给我更多的指示......?
十分感谢!
您可以通过查看强制 JVM 将内部表示转换回官方类文件格式的 API 文档来获得一些提示:
初始类文件字节表示传递给 ClassLoader.defineClass 或 redefineClasses 的字节(在应用任何转换之前),但它们可能不完全匹配它们。常量池可能没有相同的布局或内容。常量池可能有更多或更少的条目。常量池条目可能有不同的顺序;但是,方法字节码中的常量池索引将对应。某些属性可能不存在。在 order 没有意义的地方,例如方法的 order,order 可能不会被保留
从本文档中,您可以得出结论,您可以期望访问常量池的指令看起来不同,至少它们可能具有不同的索引,并且您不能假设方法被放置在连续的内存空间中。这并不意味着这些是唯一的转换,但如果需要,所有其他转换都可以反转——至少在支持 Instrumentation 的 JVM 中是这样。
在运行代码时,JVM 可能会用专门的 VM 内部指令替换指令,以优化进一步的执行。如果您好奇 JVM 可能有什么样的指令,您可以使用参数运行 Oracle 的 HotSpot-Engine
-XX:+UnlockDiagnosticVMOptions
-XX:+PrintInterpreter
然后它将打印解释器使用的所有指令及其相关本机代码的表。该表必然包含这些专门的指令。例如,在我的机器和 jdk 1.7 上,我在 203 到 231 范围内看到大约 30 个非标准字节码指令。