分析&回答
现在的计算机中一般都是有多个CPU,同时CPU会有多个核心,java在执行多线程的时,这些线程会在核心里面并行运行。在计算机的硬件内存模型中,绝大多数的数据会存储在计算机的主存中,CPU上会有一组寄存器,部分堆和栈中的数据会存储在CPU的寄存器中,CPU操作寄存器的速度要远远的高于操作主存,在CPU寄存器和主存之间还存在一层CPU Cache,CPU 的缓存分为一级缓存,二级缓存,CPU操作缓存的速度要稍微慢于寄存器,主存要比寄存器和缓存大很多。
JMM和硬件内存架构之间的桥接
Java内存模型与硬件内存架构之间存在差异。硬件内存架构没有区分线程栈和堆。对于硬件,所有的线程栈和堆都分布在主内存中。部分线程栈和堆可能有时候会出现在CPU缓存中和CPU内部的寄存器中。如下图所示:
从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:
- 线程之间的共享变量存储在主内存(Main Memory)中
- 每个线程都有一个私有的本地内存(Local Memory),本地内存是JMM的一个抽象概念,并不真实存在,它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。本地内存中存储了该线程以读/写共享变量的拷贝副本。
- 从更低的层次来说,主内存就是硬件的内存,而为了获取更好的运行速度,虚拟机及硬件系统可能会让工作内存优先存储于寄存器和高速缓存中。
- Java内存模型中的线程的工作内存(working memory)是cpu的寄存器和高速缓存的抽象描述。而JVM的静态内存储模型(JVM内存模型)只是一种对内存的物理划分而已,它只局限在内存,而且只局限在JVM的内存。
反思&扩展
喵呜面试助手: 一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!