【问题标题】:Will the JVM ever inline an object's instance variables and methods?JVM 会内联对象的实例变量和方法吗?
【发布时间】:2011-06-02 21:33:38
【问题描述】:

假设我有一个非常紧凑的内部循环,它的每次迭代都会访问和改变一个单一的簿记对象,该对象存储一些关于算法的简单数据并具有简单的操作逻辑

簿记对象是私有的和最终的,它的所有方法都是私有的、最终的和@inline。这是一个示例(使用 Scala 语法):

object Frobnicate {
  private class DataRemaining(val start: Int, val end: Int) {
    @inline private def nextChunk = ....
  }

  def frobnicate {
    // ...
    val bookkeeper = new DataRemaining(0, 1000)
    while( bookeeper.hasData ) {
      val data = bookkeeper.nextChunk
      // ......
    }
  }
 }

JVM 是否会将整个 DataRemaining 对象内联到 Frobnicate.frobnicate 中?也就是会不会把startend当作局部变量,直接将nextChunk代码内联到frobnicate中?

【问题讨论】:

    标签: java scala jvm jit jvm-hotspot


    【解决方案1】:

    在 Java 中,它可以在你所拥有的情况下内联字段和方法。它不会完全消除对象,但会接近。我认为 Scala 会以类似的方式工作。

    【讨论】:

    • 由于这是由 JVM 的 JIT 编译器完成的,因此语言无关紧要。所以是的,它确实内联了这些方法。
    • @Kim,我不确定 Scala 如何将代码转换为字节码的唯一原因。如果它有效(并且应该有效)就没有问题。如果它比看起来更动态,它可能会混淆 JIT。
    • @Bill,JVM 可以内联“虚拟”方法,如果它可以确定其中一个或两个被使用最多(而且它们很短)
    • 如果 DataRemaining 类不是私有的,内联会改变吗?我只是在考虑装饰器模式的有效性。
    • @user271996 在上面的示例中,对象是在循环外分配的。如果你在循环中创建一个对象,它不会优化它。
    猜你喜欢
    • 2023-01-27
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 2014-03-06
    • 1970-01-01
    • 2012-01-20
    相关资源
    最近更新 更多