2

例如像HotSpot ..我停止了它的编译模式,我在想类的字节码应该由操作码呈现在内存中..

但是好像我错了。。所以有高手告诉我,在将字节码加载到内存的时候,应该有一些转换过程。。

任何机构都可以就这个问题给我更多的指示......?

十分感谢!

4

1 回答 1

3

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

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

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

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


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

-XX:+UnlockDiagnosticVMOptions -XX:+PrintInterpreter

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

于 2013-10-21T13:42:12.090 回答