JVM内存结构与Java内存模型
文章目录
1)JVM内存结构
2)Java内存模型
JVM内存结构
- JVM内存结构,由Java虚拟机规范定义,描述的是Java程序执行过程中,由JVM管理的不同数据区域。
- Java代码是运行在虚拟机上的,虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,各个区域有其特定的功能。
- 1).PC寄存器
- 各个线程独享
- 2).Java虚拟机栈
- 各个线程独享
- 3).本地方法栈
- 各个线程独享
- 4).Java堆
- 所有线程共享
- 5).方法区
- 所有线程共享
- 1).PC寄存器
- 栈内存与堆内存的区别
- 1.栈内存用来存储局部变量和方法调用,堆内存用来存储Java中的对象。
- 2.栈内存属于单个线程,堆内存中的对象对所有线程可见,可以被所有线程访问。
- 3.栈内存没有可用的空间存储方法调用和局部变量,会抛出StackOverFlowError,堆则会抛出OutofMemoryError
- 4.栈的内存要远远小于堆内存。
Java内存模型
- JMM并不像JVM内存结构一样是真实存在的,只是一个抽象的概念。它与多线程相关,描述了一组规则或规范,定义了一个线程对共享变量的写入时对另一个线程是可见的。
- Java多线程之间通过共享内存进行通信。
- JMM定义了一些语法集,这些语法集映射到Java语言中就是volatile、synchronized等关键字。
- 1.主内存
- 所有的变量(实例字段,静态字段,构成数组对象的元素,但是不包括局部变量和方法参数)都必须在主内存中产生
- 2.工作内存
- 每个线程都有自己的工作内存,保存了线程需要的变量在内存中的副本。
- 线程对主内存变量的修改必须在线程的工作内存中进行,不能直接读取主内存中的变量。
- 不同线程之间也不能相互访问对方的工作内存,如需传递变量的值,必须通过主内存来作为中介进行传递。
- 1.主内存
- 工作内存与主内存进行交互
- lock
- 作用于主内存的变量,一个变量在同一时间只能一个线程锁定,表示这条线程独占这个变量。
- unlock
- read
- 把一个主内存变量的值传输到线程的工作内存
- load
- 把read操作从主内存中读取的变量的值放到工作内存的变量副本中。
- use
- 把工作内存中的一个变量的值传递给执行引擎
- assign
- 把执行引擎返回的结果赋值给工作内存中的变量
- store
- 把工作内存中的变量的值传递给主内存
- write
- 把store操作得到的值放入主内存的变量中
- 从主内存传输到工作内存,执行read->load
- 从工作内存回写到主内存,执行store->write
- lock
- java虚拟机中主内存和工作内存交互,就是一个变量如何从主内存传输到工作内存中,如何把修改后的变量从工作内存同步回主内存。
- 并发内存模型
- Java内存模型围绕着并发过程中如何处理原子性、可见性和顺序性这三个特征来设计的。
- 1.原子性
- 在Synchronized块之间的代码都具有原子性
- 2.可见性
- volatile,synchronized,final可以实现可见性
- 3.有序性
- volatile禁止指令重排序
- synchronized 一个变量在同一时刻只能被一个线程对其lock操作