验证编译器内联对象 creation/method 调用

Verify that compiler inlined object creation/method call

假设我有这样的代码:

public class InlineTest {
    private String test() {
        return "test";
    }

    public static void main(String[] args) {
        System.out.println(
          new InlineTest().test()
        );
    }
}

我知道 Java HotSpot 足够聪明,可以 inline 创建对象并调用 new InlineTest().test() 的方法。

但是我无法检查是否真的应用了内联!

Q 1:是否可以通过检查字节码来验证内联?怎么样?

如果不是一个选项:

Q 2:除了反汇编代码还有其他可能吗?

PS 我有 Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode).

关于字节码:没有字节码级别的内联。 因此,通过反汇编该字节代码无法观察到任何东西。

关于 JIT 部分:参见 here for example (or theree for IBM java)。但是你必须明白,这些事情 取决于 你的 JVM 版本;据我所知,您无法使用任何方法来了解所有类型的 JVM(Oracle、IBM、Azuul 等)每个实现到底在做什么。

除此之外:请记住 JIT 高度动态。它可能不会 立即内联方法,但可能在稍后 时间点。这个想法是 JIT 根据 runtime 数据决定它将应用哪种优化。当 JIT 后来发现可能有 更好的 机器指令序列时,它甚至可能会返回并重新编译方法 ...