Java 对象是在 CPU 的缓存中创建的还是始终是 RAM
Does Java object get created in CPU's cache or it always be RAM
我对以下事实感到困惑 read/write 到主内存的成本非常高,因此线程不会频繁调用主内存,而是尝试在缓存中工作。
现在假设 Thread-1 已经启动并创建了一个对象 - 比如 myObject - 然后启动一个新线程 - 比如 Thread-2 - 并将 myObject 的引用传递给它。
现在假设 Thread-1 在 CPU 的 core-1 中是 运行,而 Thread-2 有另一个核心 - 比如 CPU 的 core-2。现在我的问题是:
当 Thread-2 尝试访问传递给它的 myObject 时,由于它不在 core-2 的缓存中,那么 Thread-2 将在哪里寻找 myObject(因为 Thread-2已经从 Thread-1 获得了 myObject 的引用(地址)?
Thread-1 持有的地址是在 core-1 的内存位置还是主内存?
取决于前两个问题的答案:对象是否总是在 RAM 中创建,而不是在线程当前正在处理的内核的本地缓存中创建?
P.S.: 请假设图中没有同步或波动。
这不是在 Java 级别上完成的,它只是 OS 或 CPU 本身管理 RAM 使用的方式所固有的。如果您正在使用 Java,这不是您真正应该担心的事情(部分原因是 Java 应该尝试保持缓存一致(我认为它是基于对象类型这样做的?),但是也因为没有给你很多控制权)。
当你请求内存时,OS 会找到一些未使用的 RAM 给你,并将它所在的页面加载到缓存中(页面通常为 4KB)。如果您在页面的任何位置执行任何写操作,它将被标记为“dirty”。您对该页面中的对象所做的任何操作都可以在缓存级别完成,而且速度会非常快。如果另一个核心想要访问该页面中的数据,它将检查其缓存,并且 - 如果缓存未共享 - 在找不到它时导致缓存未命中,使其尝试从它会看到的 RAM 加载"dirty" 位设置,并导致缓存页面在加载之前保存到 RAM 以供新内核读取。
我对以下事实感到困惑 read/write 到主内存的成本非常高,因此线程不会频繁调用主内存,而是尝试在缓存中工作。
现在假设 Thread-1 已经启动并创建了一个对象 - 比如 myObject - 然后启动一个新线程 - 比如 Thread-2 - 并将 myObject 的引用传递给它。
现在假设 Thread-1 在 CPU 的 core-1 中是 运行,而 Thread-2 有另一个核心 - 比如 CPU 的 core-2。现在我的问题是:
当 Thread-2 尝试访问传递给它的 myObject 时,由于它不在 core-2 的缓存中,那么 Thread-2 将在哪里寻找 myObject(因为 Thread-2已经从 Thread-1 获得了 myObject 的引用(地址)?
Thread-1 持有的地址是在 core-1 的内存位置还是主内存?
取决于前两个问题的答案:对象是否总是在 RAM 中创建,而不是在线程当前正在处理的内核的本地缓存中创建?
P.S.: 请假设图中没有同步或波动。
这不是在 Java 级别上完成的,它只是 OS 或 CPU 本身管理 RAM 使用的方式所固有的。如果您正在使用 Java,这不是您真正应该担心的事情(部分原因是 Java 应该尝试保持缓存一致(我认为它是基于对象类型这样做的?),但是也因为没有给你很多控制权)。
当你请求内存时,OS 会找到一些未使用的 RAM 给你,并将它所在的页面加载到缓存中(页面通常为 4KB)。如果您在页面的任何位置执行任何写操作,它将被标记为“dirty”。您对该页面中的对象所做的任何操作都可以在缓存级别完成,而且速度会非常快。如果另一个核心想要访问该页面中的数据,它将检查其缓存,并且 - 如果缓存未共享 - 在找不到它时导致缓存未命中,使其尝试从它会看到的 RAM 加载"dirty" 位设置,并导致缓存页面在加载之前保存到 RAM 以供新内核读取。