Jdk 内存伪共享

一、什么是伪共享

5e4c5823c16c4a55a07f3fcf014678ea.png
数据X、Y、Z被加载到同一Cache Line中,线程A在Core1上修改X,而修改X会导致其所在的所有核上的缓存行均失效;假设此时线程B在Core2上读取Y,由于X所在的缓存行已经失效,所有Core2必须从内存中重新读取。线程A的操作不会修改Y,但是由于X和Y共享的是一个缓存行,就导致线程B不能很好地利用Cache,这其实就是伪共享。简单来说,伪共享指的是由于共享缓存行导致缓存无效的场景

1.1 Disruptor中如何避免伪共享

Disruptor是采用缓存行填充的方法来避免伪共享的

1.2 Contended注解方式

在JDK1.8中,新增了一种注解@sun.misc.Contended来使各个变量在Cache Line中分隔开。其原理是在使用此注解的对象或字段的前后各增加128字节大小的padding,使用2倍于大多数硬件缓存行的大小来避免相邻扇区预取导致的伪共享冲突。可以在类前或属性前加上此注释:

// 类前加上代表整个类的每个变量都会在单独的Cache Line中
@sun.misc.Contended
@SuppressWarnings("restriction")
public class ContendedData {
    int value;
    long modifyTime;
    boolean flag;
    long createTime;
    char key;
}

或者:

// 属性前加上时需要加上组标签
@SuppressWarnings("restriction")
public class ContendedGroupData {
    @sun.misc.Contended("group1")
    int value;
    @sun.misc.Contended("group1")
    long modifyTime;
    @sun.misc.Contended("group2")
    boolean flag;
    @sun.misc.Contended("group3")
    long createTime;
    @sun.misc.Contended("group3")
    char key;
}

采取上述措施图示:
8632ef8c7b7b4dddb503c754f1092f23.png
在默认情况下,@Contended注解只用于Java核心类,比如rt包下的类。 如果用户类路径下的类需要使用这个注解,则需要添加JVM参数:-XX:-RestrictContended。填充的宽度默认为128,要自定义宽度则可以设置-XX:ContendedPaddingWidth参数

相关推荐

  1. 共享内存bug

    2024-05-03 12:12:06       9 阅读
  2. docker 共享内存不足问题

    2024-05-03 12:12:06       13 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-03 12:12:06       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-03 12:12:06       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-03 12:12:06       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-03 12:12:06       18 阅读

热门阅读

  1. 产品经理的产品思维

    2024-05-03 12:12:06       9 阅读
  2. RCE学习

    RCE学习

    2024-05-03 12:12:06      13 阅读
  3. Python项目开发实战:密码学之编写加密程序

    2024-05-03 12:12:06       14 阅读
  4. 区块链 | IPFS 工作原理入门

    2024-05-03 12:12:06       10 阅读
  5. 远程为ubuntu安装teamviwer(无UI界面) - 简书

    2024-05-03 12:12:06       15 阅读
  6. 绕过Microsoft登录:安装Windows 11 23H2的两种方法

    2024-05-03 12:12:06       16 阅读
  7. ocr_class

    2024-05-03 12:12:06       9 阅读
  8. 【第5章】spring-mvc请求映射处理

    2024-05-03 12:12:06       10 阅读
  9. 第Ⅰ章-VII Typescript主要功能概览

    2024-05-03 12:12:06       11 阅读