You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JVM JIT未缓存纯方法调用?求原因解析及优化选项

关于JVM JIT未缓存纯方法调用结果的疑问

最近我在用JMH对一段Java代码做基准测试,代码如下:

interface MyInterface { public int test(int i); }
class A implements MyInterface {
    public int test(int i) { return (int)Math.sin(Math.cos(i)); }
}
@State(Scope.Thread)
public class MyBenchmark {
    public MyInterface inter;
    @Setup(Level.Trial)
    public void init() { inter = new A(); }
    @Benchmark
    public void testMethod(Blackhole sink) {
        int[] res = new int[2];
        res[0] = inter.test(1);
        res[1] = inter.test(1);
        sink.consume(res);
    }
}

我执行了这条命令来运行测试并查看编译后的汇编代码:

mvn package && java -XX:-UseCompressedOops -XX:CompileCommand='print, *.testMethod' -jar target/benchmarks.jar -wi 10 -i 1 -f 1

结果拿到C2编译的汇编代码后,发现cos和sin被调用了两次。我原本以为JVM的JIT会缓存inter.test(1)的结果——毕竟传入的参数都是1,而且这个方法看起来没有副作用,应该只需要调用一次相关方法就够了。

我现在有两个疑问:

  • 是什么阻止了JVM识别test方法为纯方法?
  • 有哪些JVM选项可以帮助实现这种缓存优化?

环境信息

  • Java版本:openjdk version "9-internal",OpenJDK 64-Bit Server VM(mixed mode)
  • JMH版本:1.19

内容的提问来源于stack exchange,提问作者Albert Netymk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:46:37