深入JVM Java内存模型

Java虚拟机规范试图定义一种Java内存模型来屏蔽掉各种硬件操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致性的内存访问效果。而相对而言,C C++是直接使用物理硬件和操作系统的内存模型,因此在不同的平台上存在差异,可能导致程序在不同平台执行效果不同,存在耦合的弊端

定义Java内存模型需要考虑得当,必须足够严谨,才能让Java的并发内存访问不出错,但是,也必须足够宽松,使得虚拟机有足够的自由空间去利用硬件的特性来获得更高的执行速度。

——主内存与工作内存

Java内存模型的主要目标是定义程序各个变量的访问规则,即在虚拟机中将变量存储到内存与从内存中取出变量的实现细节。而变量包括 实例字段,静态字段,和构成数组对象的元素,但不包括局部变量和方法参数(对应于线程私有的虚拟机栈空间),因为后者不是共享的,不存在并发访问问题。为了获得更好的性能,Java内存模型没有限制执行引擎使用处理器寄存器或缓存与主内存交互,也没有限制即使编译器的指令重排功能

Java内存模型中的变量都对应存储在主内存,同时每条线程还有自己的工作内存,类比于物理实现中处理器的高速缓存。

线程中的工作内存保存了被该线程使用的变量的主内存拷贝。线程对变量的操作必须在各自的工作内存中,而不能直接读写主内存的变量。不同线程之间也无法直接访问对方的工作内存,线程之间变量的交互都需要借助主内存

从虚拟机运行时数据区域分析,通常认为 主内存对应Java堆中的对象实例的数据部分,而工作内存对应虚拟机栈的部分区域,而从物理角度上看,主内存直接对应于物理硬件的内存,而为了获取更好的执行速度,虚拟机可能会让工作内存优先存储于寄存器和高速缓存中,因为程序运行时各自线程直接读写的是对应的工作内存 

猜你喜欢

转载自blog.csdn.net/qq_33369979/article/details/88537549