Java对象是在CPU的缓存中创建的,还是始终是RAM

时间:2017-09-27 03:06:21

标签: java multithreading concurrency java-memory-model

我对主内存的读/写成本非常高这一事实感到困惑,因此线程不会经常调用主内存,而是尝试在缓存中工作。

现在假设Thread-1已经启动并创建了一个对象 - 比如myObject - 然后启动一个新线程 - 比如Thread-2 - 并将myObject的引用传递给它。

现在假设Thread-1在CPU的core-1中运行,而Thread-2有另一个核心 - 比如CPU的core-2。现在我的问题是:

  1. 当Thread-2尝试访问传递给它的myObject时,因为它不存在于core-2的缓存中,那么Thread-2将在哪里寻找myObject(因为Thread-2已经有了引用(来自Thread-1的myObject的地址)?

  2. Thread-1在core-1的内存位置或主内存中保存的地址是?

  3. 取决于前两个问题的答案:对象是否总是在RAM中创建,而不是在线程当前正在处理的核心的本地缓存中创建?

  4. P.S。:请假设图片中没有同步或波动。

1 个答案:

答案 0 :(得分:-1)

这不是在Java级别上完成的事情,它只是操作系统或CPU本身如何管理RAM使用所固有的。如果您正在使用Java,那么您不应该担心(部分原因是Java应该尝试保持缓存一致性(我认为它基于对象类型吗?),但也因为给你的不是很多控制权。)

当您要求内存时,操作系统会找到一些未使用的RAM给您,并将其加载到缓存中的页面(页面通常为4KB)。如果您在页面的任何位置执行任何写入操作,它将被标记为" dirty"。您对该页面中的对象所做的任何操作都可以在缓存级别完成,并且速度非常快。如果另一个核心想要触摸该页面中的数据,它将检查其缓存并且 - 如果缓存未被共享 - 当它没有找到它时导致缓存未命中,使其尝试从RAM加载它会看到"脏" bit set,并在加载新内核之前使缓存页面保存到RAM中。