java缓存方法的结果

VB_*_*VB_ 5 java caching jvm microbenchmark jmh

我使用 JMH来指定操作的复杂性.如果您从未与JMH合作过,请不要担心.JMH将estimateOperation多次启动该方法,然后获得平均时间.

问题:[缩小]这个程序Math.cbrt(Integer.MAX_VALUE)每次计算一次吗?或者只是计算一次然后返回缓存结果?

@GenerateMicroBenchmark
public  void estimateOperation() {
    calculate();
}

public int calculate() {
    return Math.cbrt(Integer.MAX_VALUE);
}
Run Code Online (Sandbox Code Playgroud)

问题:[broad]: JVM是否会缓存方法的结果?

apa*_*gin 8

永远不会缓存方法返回值.但是,由于某些优化,常量折叠,常量传播,死代码消除,循环不变提升,方法内联等,JIT编译器可能会在运行时消除不必要的调用.

例如,如果Math.cbrtMath.sqrt或替换,则Math.pow在JIT编译后根本不会调用该方法,因为调用将被常量替换.(优化不起作用cbrt,因为它是一种罕见的方法,它属于JVM没有内化的本机调用).