首页 > 解决方案 > invokevirtual 是否会破坏 Java 上的标量替换?

问题描述

我希望重构我的应用程序以允许转义分析和标量替换为一个特定的对象启动,该对象经常被分配。
我假设我不会在 JVM 中达到任何内联限制,因为我可以在需要时进行调整(完全内联是 Scalar Replacement 工作的需要之一)

假设一个基本的代码流程是这样的:

public class DataHandler {
// IHandler is an interface of which there are 4 different implementations at runtime
  private IHandler handler; // child handler - implementation

  public void handleData(SomeData data) {
    HeavyObjectIWantToScalarReplace obj = new HeavyObjectIWantToScalarReplace(data);
    handler.handle(obj)
  }
}

使用对象调用虚拟方法是否足以破坏最新 OpenJDK 或 OpenJ9 的标量替换?如果是这样,可以使用哪种解决方案最接近当前的 OOP 方法,同时避免调用虚拟?
也许 invokevirtual 可以通过 JIT 进行优化,并且足以确保这 4 个处理程序类中没有一个“泄漏”对 HeavyObjectIWantToScalarReplace 的引用?

标签: javagarbage-collectionjvmopenj9

解决方案


推荐阅读