java'内存模型
java内存模型是什么
java内存模型是共享内存的并发模型,线程之间通过读—写共享变量来完成隐式的通信;
java内存模型控制线程之间的通信,决定某个线程对共享内存的写入何时对另一个线程可见。
java内存模型就是为了解决以下玉玉多线程通过共享内存通信时,缓存不一致、处理器对代码执行乱序、编译器对指令重排序三种问题应运而生。
在多线程情况下,通过共享内存通信产生的三种问题提出了java内存模型
1. 缓存一致性协议—可见性
计算机在高速的CPU和相对低速的主存之间速度不匹配的情况下,中间需要高速缓存catch进行缓冲。将运算所需的数据从主存复制到高速缓存中,CPU直接在高速缓存中存取数据,将运算结果放到高速缓存,再从高速缓存中同步到主存中。再多个CPU处理任务涉及同一块主存区域时,就可能导致缓存不一致的问题,因此在高速缓存和主存之间必须遵守一个缓存一致性协议。
2. 处理器优化—原子性
进一步提高CPU的执行效率,为了处理器内部运算单元能够被最大化充分利用,会将输入的代码乱序执行处理,这就是处理器优化。
3. 指令重排序—有序性
现代的处理器采用指令级并行技术将多条指令重地执行,如果不存在数据依赖性,处理器会改变语句对应机器指令的执行顺序,这就是指令重排序。
java运行时数据区
java运行时数据区将java内存划分为5个区域,堆、方法区、本地方法栈、java虚拟机栈、程序计数器
1. 堆
堆是线程共享的内存区域,存放对象实例。是垃圾回收的主要区域。
堆可分为新生代和老年代,新生代又可细分为Eden区、Survivor from区和Survivor to区。
2. 方法区
方法区是线程共享的内存区域,存放已被虚拟机加载的类信息,静态变量、常量、即时编译器编译后的代码等数据。
3. java虚拟机栈
java虚拟机栈是线程私有的内存区域,描述java线程执行的内存模型,每个方法在执行的时候,都会创建一个栈帧,栈帧里面存放局部变量表、操作数栈、方法出口、动态链接等信息。每个方法对应一个栈帧。
局部变量表存放了基本类型、对象引用和方法返回类型(指向了一条字节码指令地址)。
4. 本地方法栈
本地方法栈是线程私有的内存区域,里面的方法都有关键字native,是直接和系统交互的方法, 使用非java语言实现。
5. 程序计数器
程序计数器是线程私有的内存区域,用于保存该线程执行到哪里,下一条指令的位置。