关于缓存行填充的一点思考

1.此文是记录我学习缓存行填充的一点思考,之前对缓存行填充只是有浅显的了解。
2.我不会从很基本的地方说起,这不是入门缓存行填充的文章。
3.看了很多关于缓存行的文章,但是很少去提及对象头是怎么缓存的,很疑惑。

我们要明白,缓存行填充主要解决的是伪共享(false sharing)问题。而64位OS一般缓存行是64字节(最常用),因此为了解决伪共享问题,我们采用缓存行填充的方式使缓存值的大小为64字节。

简单说一下Java6、Java7、Java8的处理方式,然后在利用Disruptor中的缓存填充做一下分析吧。

Java6的处理方式
// 64位OS,对象头本身有16字节,
public final static class FillLong { 
        public volatile long value = 0L;    // 8字节
        public long p1, p2, p3, p4, p5;    // 40字节
}
// 对象头本身有8字节,
public final static class FillLong { 
        public volatile long value = 0L;    // 8字节
        public long p1, p2, p3, p4, p5, p6;    // 48字节
}  

通过上面的方式可以减少出现伪共享的概率,但是不能绝对保证,原因一会Disruptor的填充方式。

Java7的处理方式
// 64位OS,对象头本身有16字节
public final static class FillLPadding { 
        public long p1, p2, p3, p4, p5;    // 40字节
}
public final static class FillLong { 
        public volatile long value = 0L;    // 8字节
} 
// 32位OS,对象头本身有8字节
public final static class FillLPadding { 
        public long p1, p2, p3, p4, p5;    // 48字节
}
public final static class FillLong { 
        public volatile long value = 0L;    // 8字节
} 

Java7会优化掉无用的字段,所以采用继承的方式填充对象。依据JVM对象继承中父类属性与子类属性关系,内存地址会连续排列布局的原因。这样可以防止Java7的优化。

Java8的处理方式,采用注解
@Contended
public final static class FillLong { 
        public volatile long value = 0L;    // 8字节
} 

在JDK1.8中,新增注解@sun.misc.Contended,来使各个变量在Cache line中分隔开。注意,jvm需要添加参数-XX:-RestrictContended才能开启此功能。

最后在看看Disruptor中防止伪共享的方式。

这种方式可以保证不会出现伪共享,可能是作者基于Java7编写的框架,没有用到注解,上代码:


class LhsPadding
{
    protected long p1, p2, p3, p4, p5, p6, p7;
}
class Value extends LhsPadding
{
    protected volatile long value;
}
class RhsPadding extends Value
{
    protected long p9, p10, p11, p12, p13, p14, p15;
}

这种将Value放在中间的方式,可以保证任何时候都不会出现伪共享。
顺便提一点,数组在内存中是连续存储的,结合预读性原理来看的话,缓存填充的方案是可以放在数组元素出现伪共享的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值