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

lllllllllllll

例如,像HotSpot ..我停止了其编译模式,我认为类的字节码应该在操作码显示的内存中

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

谁能给我更多有关此问题的说明...?

非常感谢!

霍尔格

通过查看可迫使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上,我看到203到231范围内的大约30条非标准字节码指令。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章