IDEA 配置-XX:-RestrictContended参数

1. 配置原因

在JDK 8 提供了一种消除伪内存共享的方式:

  1. 在code中添加sun.misc.Contended注解;
  2. 将JVM参数配添加上-XX:-RestrictContended;
    则实现了一个小的测试程序,用于测试上述配置的效果;

2. 配置方法

配置方法很简单,将上述参数添加到配置文件中即可(特别强调,需要使用JDK8 ,JDK12 不支持):
IDEA 配置-XX:-RestrictContended参数_第1张图片

  1. 上述文件打开方式为:工具栏中 Help --> Edit Custom Vm Options
  2. -XX参数中 boolean类型在-XX:+RestrictContended为该属性设置为true,-XX:-RestrictContended,为设置为false;
  3. 上述参数为JVM虚拟机启动时使用;

3. 问题调试

上述参数修改后,在code中添加好注解,发现一个问题:
IDEA 配置-XX:-RestrictContended参数_第2张图片
Contended类找不到,则肯定编译不过啊,这个问题需要解决:

3.1 排查方向:

  1. 需要确认是否为上述JVM参数没有添加成功?其实这个可能性比较小,因为从JVM建立的角度来讲,这些参数要在运行时才会使用,而此时还是在编译阶段;
    • 在命令行打印:java -XX:+PrintFlagsFinal,但是通过这个命令看到我们JVM参数运行的时候:RestrictContended为true,难道真的是参数配置没有生效?
    • 由于JVM参数是在运行时生效,我决定先注释掉该注解,先运行下试试上述参数是否有生效:
      IDEA 配置-XX:-RestrictContended参数_第3张图片
      从这个结果很明显可以看出这个参数配置是成功了的,所以原因的话应该跟包相关;
  2. 需要确认是这个类确实没有,还是我们这里没有导入;
    IDEA 配置-XX:-RestrictContended参数_第4张图片
    可以看到上述包内确实没有Contended类,则有两个可能:
    • JDK版本不对
    • 该包我们没有导入;

则首先验证是否为JDK版本不对的问题, 有可能在JDK8中添加进去后,在JDK12被优化掉了;

  1. 修改配置,将project版本配置为JDK1.8
    IDEA 配置-XX:-RestrictContended参数_第5张图片
    由于我这里之前添加过1.8的path,所以就不用另外添加一次了,直接选择路径即可;
  2. SDKs中确认下版本:
    IDEA 配置-XX:-RestrictContended参数_第6张图片
  3. Module
    IDEA 配置-XX:-RestrictContended参数_第7张图片
  4. compile
    IDEA 配置-XX:-RestrictContended参数_第8张图片
    修改完成后,查看该注解:
    IDEA 配置-XX:-RestrictContended参数_第9张图片
    已经可以找到了

所以上述问题的原因为JDK版本不对,即这个配置还需要在JDK 8才能使用

4. 测试结果

  1. 没有添加该注解:
    IDEA 配置-XX:-RestrictContended参数_第10张图片
  2. 添加注解
    IDEA 配置-XX:-RestrictContended参数_第11张图片
    可以看到整体速度提高了一倍

你可能感兴趣的:(IDEA 配置-XX:-RestrictContended参数)