JMM(Java Memory Model)

Java 虚拟机规范中定义了Java 内存模型(Java Memory Model,JMM),用于屏蔽硬件和操作系统的内存访问差异,实现让 Java 程序在各种平台下都能达到一致的并发效果。JMM 制定了 Java 虚拟机与计算机内存协同工作的规范:规定了一个线程如何、何时可以看到其他线程修改后的共享变量的值,以及在必须时如何同步访问共享变量。

  • 原始类型的本地变量,总是存放在虚拟机栈上。

  • 指向对象的一个引用的本地变量,引用存放在线程栈上,对象本身存放在上。

  • 一个对象可能包含方法,这些方法可能包含本地变量。这些本地变量仍然存放在线程栈上,即使这些方法所属的对象存放在堆上。

  • 一个对象的成员变量随着这个对象自身存放在堆上。不管这个成员变量是原始类型还是引用类型。

  • 静态成员变量跟随着类定义一起也存放在堆上。

  • 存放在堆上的对象可以被所有持有对这个对象引用的线程访问。当一个线程可以访问一个对象时,它也可以访问这个对象的成员变量。如果两个线程同时调用同一个对象上的同一个方法,它们将会都访问这个对象的成员变量,但是每一个线程都拥有这个成员变量的私有拷贝

  • 线程之间的共享变量存储在主内存(Main Memory)中

  • 每个线程都有一个私有的本地内存(Local Memory),本地内存是JMM的一个抽象概念,并不真实存在,它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。本地内存中存储了该线程以读/写共享变量的拷贝副本。

  • 从更低的层次来说,主内存就是硬件的内存,而为了获取更好的运行速度,虚拟机及硬件系统可能会让工作内存优先存储于寄存器和高速缓存中。

  • Java内存模型中的线程的工作内存(working memory)是CPU的寄存器和高速缓存的抽象描述。而JVM的静态内存储模型(JVM内存模型)只是一种对内存的物理划分而已,它只局限在内存,而且只局限在JVM的内存。