例如,像HotSpot ..我停止了其编译模式,我认为类的字节码应该在操作码显示的内存中。
但是似乎我错了..所以一些专家告诉我,将字节码加载到内存中时应该有一些转换过程。
谁能给我更多有关此问题的说明...?
非常感谢!
通过查看可迫使JVM将内部表示形式转换回官方类文件格式的API文档,您可以得到一些提示:
初始类文件字节表示传递给ClassLoader.defineClass或redefineClasses的字节(在应用任何转换之前),但是它们可能与它们不完全匹配。常量池可能没有相同的布局或内容。常量池可能具有更多或更少的条目。常量池条目的顺序可能不同。但是,方法的字节码中的常量池索引将对应。某些属性可能不存在。如果顺序没有意义,例如方法的顺序,则可能无法保留顺序
从本文档中,您可以得出以下结论:可以预期访问常量池的指令看起来会有所不同,至少它们可能具有不同的索引,并且您不能假定方法已放置在连续的内存空间中。这并不意味着这些是唯一的转换,但是所有其他转换都可以根据需要进行逆转-至少在支持Instrumentation的JVM中。
在运行代码时,JVM可能会用专用的VM内部指令代替指令,以优化进一步的执行。如果您好奇JVM可能使用哪种指令,则可以使用以下参数运行Oracle的HotSpot-Engine:
-XX:+UnlockDiagnosticVMOptions
-XX:+PrintInterpreter
然后,它将打印解释程序使用的所有指令及其关联的本机代码的表。该表将必然包含这些专门说明。例如在我的机器和jdk 1.7上,我看到203到231范围内的大约30条非标准字节码指令。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句