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

标签 jvm bytecode

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

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

有人可以给我关于这个问题的更多说明吗...?

非常感谢!

最佳答案

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

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

The initial class file bytes represent the bytes passed to ClassLoader.defineClass or redefineClasses (before any transformations were applied), however they might not exactly match them. The constant pool might not have the same layout or contents. The constant pool may have more or fewer entries. Constant pool entries may be in a different order; however, constant pool indices in the bytecodes of methods will correspond. Some attributes may not be present. Where order is not meaningful, for example the order of methods, order might not be preserved

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


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

-XX:+UnlockDiagnosticVMOptions -XX:+PrintInterpreter

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

关于jvm - 某些JVM将ByteCode加载到内存后会做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19458333/

相关文章:

java - 扩展类的 Scala 特征是如何为 JVM 目标编译的?

java - Scala 生成的字节码到 Java 代码的转换

java - 如何指定这些VM参数?

scala - 如何在运行应用程序或测试用例时将JVM选项传递给SBT以使用?

Java 优化 : speed of inner loops inconsistent?

java - 在程序终止的情况下如何关闭端口?

java - 如何从类文件中获取类的成员

java - 为什么.class文件的常量池表中没有列出一维数组类型?

java - 字节码编译错误

java - Java 7 中的 Survivor 大小是多少