首页 > 解决方案 > 为什么 java8'annotation @Contened 使用 128 字节,这是大多数硬件上缓存行大小的两倍

问题描述

大多数硬件上的cacheline大小是64字节。</p>

我不知道为什么@Contened 在字段或对象之前和之后填充 128 个字节?

我已经尝试阅读以下两篇文章来缓解我的困惑。</p>

悲观地处理启用相邻缓存行预取器的情况

请注意,我们使用 128 字节,是大多数硬件上缓存行大小的两倍,以针对相邻扇区预取器进行调整,将错误共享冲突扩展到两个缓存行

他们都说使用 128 字节的原因是为了调整相邻扇区预取器,将错误共享冲突扩展到两个缓存行。</p>

但是启用相邻缓存行预取器的情况是什么?

标签: javamultithreadingfalse-sharing

解决方案


我通过阅读以下两篇文章解决了我的困惑

我总结了为什么使用 128 字节(两倍缓存线大小)来填充的两个原因

  • 大多数现代主流处理器的缓存线大小是64字节或128字节。如果我们用64字节填充,这也会在缓存线大小为128字节的处理器中造成错误分片。

  • CPU Adjacent Sector Prefetch是 Intel 处理器特有的 BIOS 功能,启用此功能后,处理器会读取包含当前请求数据的缓存行,并预取下一个缓存行,预取可以同时占用两条缓存行

由于这两个原因,我们必须将填充大小加倍。


推荐阅读