JVM和JMM内存模型
JVM内存模型
JVM内存模型主要指运行时的数据。
-
线程独占
-
栈(Stack)
栈,也叫方法栈。
线程私有的。
线程在执行每个方法时都会同时创建一个栈帧,用来存储局部变量表、操作栈、动态链接、方法出口等信息。
调用方法时执行入栈,方法返回时执行出栈。 -
本地方法栈(Native Method Stack)
与栈类似,native方法使用本地方法栈。 -
程序计数器(Program Counter)
每个线程工作时都有一个独立的计数器,保存着当前线程所执行的字节码位置。
-
-
线程共享
-
堆(Heap)
线程共享。
存放对象实例。 -
方法区(Method Area)
也叫非堆区。
存放虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
JDK1.7 永久代和JDK1.8 Metaspace都是方法区的实现。
-
JMM内存模型
主内存、线程自己的工作内存
-
原子性
基本数据读写,如int a = 10;
synchronized
关键字 -
可见性
volatile
关键字(强制内存同步保证不同的线程总是能够看到该变量的最新值,阻止指令重排序)
synchronized
关键字 -
有序性
volatile
关键字(强制内存同步保证不同的线程总是能够看到该变量的最新值,阻止指令重排序)
synchronized
关键字 -
happens-before规则
程序顺序规则,即一个线程内必须保证语义串行性
锁规则,即对同一个锁的解锁一定发生在再次加锁之前