一次关于缓存行的切身体验

缓存行

在这里插入图片描述

都是遍历为什么差距就这么大呢?

差距就在缓存

CPU的缓存是以行为单位的,一次读就读连续的一整行(64字节),失效也是一起失效.

而上面的这种二维数组在内存中的存储时连续的
在这里插入图片描述

在加载缓存的时候会把附件的元素也一起读入(因为时连续的)

按行遍历是依照内存的存储顺序依次遍历,缓存的利用率高所以快

而按列遍历时跳跃式的遍历,他不是连续的.这时候缓存的利用率就极低(数组越大越明显),CPU要频繁的去主存中取数据,效率可想而知.

伪共享

相互独立的变量,在同一个缓存行上,这些变量都分别被多个CPU频繁修改,导致整个缓存行经常失效.一个变量改了其他的变量也失效了…

这就非常尬尴了.

缓存行对齐

为了解决上面的尬尴,我们可以手动将一个对象对齐一行.

但是这样有很大的问题,因为不同平台的缓存行,对象大小并不一定时一样的.

这违背了java的核心思想 跨平台

好在jdk1.8以后提供@sun.misc.Contended这个注解可以由jvm帮忙我们实现对齐

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值