将ByteCode加载到内存后,某些JVM会做什么?

时间:2013-10-18 20:16:43

标签: jvm bytecode

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

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

有没有人能给我更多关于这个问题的指示......?

非常感谢你!

1 个答案:

答案 0 :(得分:2)

您可以通过查看强制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之间。