在Java中,如何刷新CPU内存缓存以便从RAM内存中检索最新内存?

Geo*_*met 2 java concurrency volatile synchronized

计算机具有RAM内存,但它也具有小巧,快速的CPU内存缓存.Java内存模型保证在访问变量时刷新CPU内存缓存volatile,但由于我们只在单个线程中的单个类中使用该volatile变量,因此不确定JIT是否只是优化它.

为了诊断一个bug(当我们在某个时刻调用Thread.sleep()足够长时才会出现这个bug),我们需要能够做这样的事情(而不是sleep()):

System.clearCpuCache();
Run Code Online (Sandbox Code Playgroud)

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

jan*_*neb 8

你一般不能.除性能外,缓存的存在对应用程序是透明的.这也适用于多处理器系统,只要缓存系统是"缓存一致的",这实际上是当今使用的所有平台.

因此,你的错误在其他地方.

像volatile和synchronized块这样的东西不会影响缓存一致性本身,而是影响寄存器优化,使用原子指令(包括刷新存储缓冲区,这与缓存不同!),等等.这些是你应该看的东西(好吧,鉴于你的描述中缺乏细节,很难说,但作为第一个猜测..),而不是试图刷新缓存.