您的位置:首页 > 编程语言 > Java开发

深入浅出理解 | Java 内存模型

2015-07-21 01:11 561 查看

Java 内存模型

一. 硬件层面的内存模型




这个图是说明计算硬件的存储层次(memory hierarchy)之中,寄存器(register)最快,内存其次,最慢的是硬盘。

大多数的内存运算任务都不可能只靠处理器“计算”完成,处理器需要与与内存进行交互,如读取运算数据、存储运算结果等,这个I/O操作很难消除。计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统不得不加入一层读写速度极可能接近处理器运算速度的高速缓存(Cache)作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能够快速的运行,运算结束后把运算结果从缓存中同步到内存中,这样处理器就不需要等待缓慢的内存读写了。

但这里有一个问题:缓存一致性(Cache Coherence)。在多处理器系统中,每个处理器都有一个自己的高速缓存,同时他们也共享同一个主内存(Main Memory), 当多个处理器运算任务同时涉及到同一块主内存区域时,会导致各自的缓存数据不一致,那要以谁的缓存数据为主呢?所以为了解决这个问题,每个处理器访问缓存时都需要遵循一些协议,在读写时根据协议进行操作,这些协议有MSI,MESI,MOSI,Synapse,Firefly,Dragon Protocol等。

内存模型,可以理解成在特定的操作协议下,对特定的内存或高速缓存进行读写访问的过程抽象。不同架构的物理机器拥有不一样的内存模型。这里的内存访问操作与硬件缓存访问操作与Java虚拟机的内存模型很类似。



除了高速缓存,为了使处理器内部的运算单元能尽量被充分利用,处理器可能会对输入代码进行乱序执行(Out-Of-Order Execution)优化,处理器会在计算之后将乱序执行结果进行重组,保证该结果与顺序执行的结果一致。这与Java虚拟机的即时编译器中的指令重排序类似

二. Java的内存模型(Java Memory Model JMM)

Java的内存模型主要是为了定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量的底层细节。这里的变量是指实例字段、静态字段和构成数组对象的元素,但不包括局部变量与方法参数,因为他们是线程私有的,不会被共享,自然不会存在竞争问题。

Java内存模型规定所有变量都存储在主内存(这个只是虚拟机内存的一部分,与之前的主内存类比)中,每个线程有自己的工作内存(与之前的高速缓存类比)。线程工作内存中保存了该线程使用到的主内存中的变量副本拷贝,线程对变量的操作都是在他们的工作内存中,而不直接读写主内存中的变量。线程之间变量值得传递需通过主内存来完成。



这里我们会突然想到可不可以类比Java的内存划分,我们把Java内存划分拿出来类比下:



这里我们要注意内存条中,方法区和堆是所有线程共享的,而JVM栈,本地方法栈,程序计数器是线程隔离的。

Java的主内存主要对应Java堆中对象实例的部分数据,工作内存对应JVM栈中的部分区域。更底层对应整个PC的话,主内存对应主机内存条,为了获取更好的运行速度,虚拟机可能会让工作内存优先存储于寄存器和高速缓存中,因为程序运行时主要读写的是工作内存。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: