验证编译器内联对象创建/方法调用

时间:2017-02-28 10:32:35

标签: java jvm jvm-hotspot

假设我有这样的代码:

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()对象创建和方法调用Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)

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

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

如果不是选项:

问题2:除了反汇编代码之外还有其他可能吗?

PS我有 [HttpPost] public string data (Models.ExModel data) { var hub = GlobalHost.ConnectionManager.GetHubContext<Hubs.MyHub1>(); //Execute Code //send to client hub.Clients.All.Message(data.apaAja); return "success"; }

1 个答案:

答案 0 :(得分:1)

关于字节代码:字节代码级别上有内联。 因此,通过解组那个字节代码就无法观察到任何事情。

关于JIT部分:例如,请参阅here(或IBM Java的theree)。但是你必须要理解你的JVM版本依赖;据我所知,没有任何办法可以用来理解各种JVM(Oracle,IBM,Azuul,......)每个实现的内容究竟是什么。

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