【问题标题】:In Java, how do I flush the CPU memory cache so it retrieves the latest from the RAM memory?在 Java 中,如何刷新 CPU 内存缓存以便从 RAM 内存中检索最新的?
【发布时间】:2012-03-06 11:07:20
【问题描述】:

一台计算机有 RAM 内存,但它也有更小、更快的 CPU 内存缓存。 Java 内存模型保证在使用volatile 访问变量时刷新 CPU 内存缓存,但由于我们仅在单个线程的单个类中使用该易失性变量,因此不确定 JIT 是否只是优化它离开。

要诊断一个错误(只有在我们调用 Thread.sleep() 的时间足够长时才会出现),我们需要能够做这样的事情(而不是 sleep()):

System.clearCpuCache();

实现这种方法的最简单和最可靠的方法是什么?它应该保证它不会 JIT 优化掉缓存刷新。 我们只能在启用 JIT 的情况下重现我们的错误,因此禁用 JIT 不是一种选择。

【问题讨论】:

  • 进入和退出 synchronized 块也应该可以工作
  • 我从未听说过 JIT 优化了易失性写入。你有任何文件证明它会这样做吗?
  • @Johannes 根本没有证据,只是怀疑:)
  • 你说的是一个错误。它的症状是什么?当你只使用一个线程时,遇到 volatile、JIT 和并发问题是很奇怪的。如果可能的话,请发布一个可测试的代码,其中包含产生错误的“睡眠”。你可能看错了方向。
  • 赏金评论中的“刷新存储缓冲区”是什么意思?你选择了相关的词吗?请提供详细信息和代码

标签: java concurrency volatile synchronized


【解决方案1】:

你通常不能。除了性能之外,缓存的存在对应用程序是透明的。这也适用于多处理器系统,只要缓存系统是“缓存一致的”,这几乎是当今所有平台都在使用的。

因此,您的错误存在于其他地方。

像 volatile 和 synchronized 块这样的东西本身并不影响缓存的一致性,而是寄存器优化、原子指令的使用(例如,刷新存储缓冲区,这与缓存不同!),以及很快。这些是您应该查看的内容(好吧,鉴于您的描述中缺乏细节,很难说,但作为第一个猜测..),而不是尝试刷新缓存。

【讨论】:

  • 在那种情况下,如何可靠地刷新存储缓冲区?
  • @GeoffreyDeSmet:视情况而定。在 x86 上,例如“mfence”指令。在 Java 中,使用 volatile、同步块等应该会导致 JVM 发出必要的指令。
【解决方案2】:

对 volatile 变量的访问应该绕过缓存,而不是刷新它。所以清除缓存不应该影响 volatile 的行为。 错误是如何表现出来的?您是否在 Thread.sleep() 之后以及在同一个线程上看到过时的值? 许多年前,我为 Java 兼容性测试套件编写了测试。其中一项测试证明 volatile 变量可以从缓存中读取,而不是从主存中读取。我想知道那个错误是否仍然存在。请将详细信息发送至 rfq(at)list.ru,我将尝试创建令人信服的测试。

【讨论】:

    【解决方案3】:

    我不确定这里是否是这种情况(需要更详细的信息!),但是如果您看到 volatile 的硬线程错误,需要注意的一件事是 volatile 不一定是原子的。

    即你可能认为你已经更新了一个 volatile 变量并且新值应该是可见的,但实际上你没有,因为完整的更新还没有完成。

    http://www.ibm.com/developerworks/java/library/j-jtp11234/

    【讨论】:

      【解决方案4】:

      你试过AtomicInteger吗?

      如果值总是由同一个线程更改/读取,我看不出如何从 cpu 缓存中获取错误版本的 volatile int。也许尝试打印出在变量的每次读/写时哪个线程处于活动状态,只是为了 100% 确定:

      System.out.println(Thread.currentThread().getName());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-02
        • 2012-07-01
        相关资源
        最近更新 更多