Java内存管理
1. JMM
java的内存模型
1.1 主内存和工作内存
Java 内存模型规定了所有的变量都存储在主内存(Main Memory)中,每条线程有自己的工作内存(Working Memory),线程的工作内存中保存了该线程所使用到的变量的内存副本。 不同线程之间无法直接访问其他线程工作内存中的变量,线程间变量的传递都要通过主内存来完成(如下图 2-1所有)。
1.2 执行引擎
执行引擎,就是一个运算器,能够识别输入的指令,并根据输入的指令执行一套特定的逻辑。
1.3 主内存和工作内存的交互模型
Java 内存模型中定义了 8 种操作完成主内存与工作内存之间具体的交互协议,虚拟机实现时必须保证 每一种操作都是原子级、不可再分的。 这 8 种操作又可分为作用于主内存和作用于工作内存的操作。
1.3.1 作用于主内存的操作
- lock 作用于主内存的变量,它把一个变量标识为一条线程独占的状态。
- unlock 作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才能被其他线程锁定。
- read 作用于主内存的变量,它把一个变量的值从主内存传输到工作内存中,以便 laod 时使用。
- write 作用于主内存的变量,它把 store 操作从工作内存中得到的变量值存入到主内存变量中。
1.3.2 作用于工作内存的操作
- load 作用于工作内存的变量,它把 read 操作从主内存中得到的变量值放入工作内存的变量副本中。
- use 作用于工作内存的变量,它把一个工作内存中的一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用的变量的值的字节码执行时会执行这个操作。
- assign 作用于工作内存的变量,它把一个执行引擎接收到的值赋给工作内存的变量,每当虚拟机遇到一个变量赋值的字节码执行时执行这个操作。
- store 作用于工作内存的变量,它把工作内存中的一个变量的值传送到主内存中,以便随后的 write 操作。