【问题标题】:Java Byte code to machine code conversion [closed]Java字节码到机器码的转换[关闭]
【发布时间】:2018-10-24 20:33:29
【问题描述】:

JVM 何时将字节码转换为机器码? 1. 类加载时每个类只有一次? 2.在创建类的每个对象时,例如Student类中的Student对象? 3. 还是在每次方法调用期间?

这将如何在方法调用期间与方法堆栈同步。

【问题讨论】:

  • 回复。第一个问题:我认为这取决于命令行选项和JVM。我很确定从历史上看,命令行上的-server 开关会导致所有字节码在任何执行之前都被编译。但是我相信现在所有 64 位 JVM 都会预编译字节码,无论它们是否作为服务器运行。
  • 此页面可能是相关的,尽管其中一些信息似乎很旧。 stackoverflow.com/questions/198577/…
  • 在这个页面上它说 64 位 JVM 隐含了 -server 选项:docs.oracle.com/javase/10/tools/java.htm
  • @markspace 正确,从来没有“客户端”64 位 JVM(如果是 HotSpot)。但是无论如何,客户端和服务器 JVM 之间的区别已经被“分层编译”所取代。简单来说,JVM还是以解释模式启动,但是会用tier1编译器(相当于client)快速编译常用的方法,但是用tier2编译器(相当于server)花更多的时间在最热点的profiling和优化上。

标签: java jvm jit


【解决方案1】:

“当它感觉像它时”。我不是要轻浮,但没有普遍的答案。

JVM 可以解释字节码,也可以将其编译为本机机器码。机器代码运行得更快,但编译它需要时间和空间。因此,需要进行权衡,并且没有要求以一种或另一种方式处理权衡。事实上,它可以从一个 JVM 到另一个,或一个版本到另一个。

主题被称为“及时”编译(JIT),会有不同的实现。请查阅您的 JVM 文档。

我的猜测是,一种可能的机制是注意到相同的方法已经执行了“若干次”,因此可以从编译为机器代码中受益。即,您的#3 答案可能是最接近的。

【讨论】:

    【解决方案2】:
    1. 在类加载期间每个类只有一次?
    2. 在创建类的每个对象时?
    3. 在每个方法调用期间?

    以上都不是!

    当类首次加载时,JVM 将在调用方法以收集一些统计信息时解释字节码。稍等片刻,JVM 会挑选被调用过几次的方法,并将那些方法编译为本机代码。

    但这还没有结束。在某些情况下,JIT 编译器实际上可能会重新编译/重新优化它已经编译的方法。如果(例如)另一个类被加载(延迟或动态)导致先前优化的基础无效,则可能会发生这种情况。


    这将如何在方法调用期间与方法堆栈同步。

    深入的实施细节。 (但我认为在解释字节码和运行已编译的本机代码时,方法的堆栈布局是相同的。)

    【讨论】:

    • 我的理解是JIT编译不会改变对象的布局和堆栈,但是将来可能会。
    • 是的......如果(假设)未来的 JIT 编译器能够更改堆栈帧布局,它还需要处理编译当前正在执行的方法的问题......关于一些线程。
    • 实际上,堆栈布局可能会有很大差异。首先要注意的是,编译后的代码需要更少的堆栈空间。考虑到方法内联、消除未使用和冗余变量以及使用 CPU 寄存器,这很容易解释。但是为什么它应该是“同步的”呢?唯一重要的是,当从解释代码调用编译方法时,能够在调用者和被调用者之间传递参数和返回值,反之亦然。而且,JVM 记录代码的来源以便能够重建堆栈跟踪,至少在某些安全点
    • @Holger - 如果一个方法在调用过程中被编译会发生什么? (我假设这可能发生......)编译的方法如何能够处理在方法的解释版本中创建的局部变量?例如当你从调用其他东西返回到方法时?
    • 正常模式是为下一个方法入口编译,不影响当前执行。如果它是一个长时间运行的方法,JVM 可能会决定使用“堆栈替换”(OSR)。在编译之前必须知道从解释执行接收控制的要求,因为它会改变结果代码并可能降低优化的有效性。在 vtable 中注册的代码(将在下一次调用时输入)与为 OSR 编译的代码之间存在一般区别。后者可能会在所有实际执行完成后被删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多