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
相关产品推荐
相关产品推荐

