IDEA 配置-XX:-RestrictContended参数
1. 配置原因
在JDK 8 提供了一种消除伪内存共享的方式:
- 在code中添加sun.misc.Contended注解;
- 将JVM参数配添加上-XX:-RestrictContended;
则实现了一个小的测试程序,用于测试上述配置的效果;
2. 配置方法
配置方法很简单,将上述参数添加到配置文件中即可(特别强调,需要使用JDK8 ,JDK12 不支持):
- 上述文件打开方式为:工具栏中 Help --> Edit Custom Vm Options
- -XX参数中 boolean类型在-XX:+RestrictContended为该属性设置为true,-XX:-RestrictContended,为设置为false;
- 上述参数为JVM虚拟机启动时使用;
3. 问题调试
上述参数修改后,在code中添加好注解,发现一个问题:
Contended类找不到,则肯定编译不过啊,这个问题需要解决:
3.1 排查方向:
- 需要确认是否为上述JVM参数没有添加成功?其实这个可能性比较小,因为从JVM建立的角度来讲,这些参数要在运行时才会使用,而此时还是在编译阶段;
- 在命令行打印:java -XX:+PrintFlagsFinal,但是通过这个命令看到我们JVM参数运行的时候:RestrictContended为true,难道真的是参数配置没有生效?
- 由于JVM参数是在运行时生效,我决定先注释掉该注解,先运行下试试上述参数是否有生效:
从这个结果很明显可以看出这个参数配置是成功了的,所以原因的话应该跟包相关;
- 需要确认是这个类确实没有,还是我们这里没有导入;
可以看到上述包内确实没有Contended类,则有两个可能:- JDK版本不对
- 该包我们没有导入;
则首先验证是否为JDK版本不对的问题, 有可能在JDK8中添加进去后,在JDK12被优化掉了;
- 修改配置,将project版本配置为JDK1.8
由于我这里之前添加过1.8的path,所以就不用另外添加一次了,直接选择路径即可; - SDKs中确认下版本:
- Module
- compile
修改完成后,查看该注解:
已经可以找到了
所以上述问题的原因为JDK版本不对,即这个配置还需要在JDK 8才能使用
4. 测试结果
- 没有添加该注解:
- 添加注解
可以看到整体速度提高了一倍