java缓存方法的结果

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

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

 @GenerateMicroBenchmark public void estimateOperation() { calculate(); } public int calculate() { return Math.cbrt(Integer.MAX_VALUE); } 

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

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

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

没有。

简单地说,Java不会缓存方法结果,因为方法每次都可以返回不同的值。

是的,它会在每次调用时调用该代码

 public int calculate() { return Math.cbrt(Integer.MAX_VALUE); } public double calculate(); Code: 0: ldc2_w #3 // double 2.147483647E9d 3: invokestatic #5 // Method java/lang/Math.cbrt:(D)D 6: dreturn 

要有缓存,只需将该幻数替换为

私有静态最终字段

 private static final double NUMBER = Math.cbrt(Integer.MAX_VALUE); 

回答狭义问题:它取决于JVM实现以及如何解释代码。

回答广泛的问题:不,因为正如Anubian所指出的那样,方法可以在每次调用时返回不同的值。