某些JVM在将字节码加载到内存后做什么?

某些JVM在将字节码加载到内存后做什么?,jvm,bytecode,Jvm,Bytecode,比如像热点。。我停止了它的编译模式,我在思考类的字节码 应该被礼物留在记忆中 但似乎我错了。。所以一些专家告诉我应该有一些 将字节码加载到内存时的转换过程 有没有人能给我更多关于这个问题的指示 多谢各位 通过查看迫使JVM将内部表示转换回正式类文件格式的API文档,您可以得到一些提示: 初始类文件字节表示传递给ClassLoader.defineClass或RedefineClass的字节(在应用任何转换之前),但是它们可能不完全匹配。常量池可能没有相同的布局或内容。常量池可能有更多或更少的条

比如像热点。。我停止了它的编译模式,我在思考类的字节码 应该被礼物留在记忆中

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

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


多谢各位

通过查看迫使JVM将内部表示转换回正式类文件格式的API文档,您可以得到一些提示:

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

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


在运行代码时,JVM可能会用专门的VM内部指令替换指令,以优化进一步的执行。如果您想知道JVM可能有什么类型的指令,可以使用参数运行Oracle的HotSpot引擎

-XX:+UnlockDiagnosticVMOptions
-XX:+PrintExplorer


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

在Hotspot dev邮件列表中,您可能会更幸运。