一.整体方向
JVM内存结构是和java虚拟机的运行时区域有关。
Java内存模型和java并发编程有关。
java对象模型和java对象在虚拟机中的表现形式有关。
1.JVM内存结构
堆:通过new或者其他指令创建的实例对象,会被垃圾回收。动态分配。
虚拟机栈:基本数据类型,对象本身在堆中,对象的引用在栈中,特点是创建的时候大小固定,不会被改变。
方法区:数据是共享的,存的是静态信息,类信息以及常量信息,和永久引用。
本地方法栈:调用native方法,不是用java写的方法。
程序计数器:最小的区域,主要是保存当前字节码的行号数,上下文切换,指令,异常处理等等。
2.Java对象模型
首先会在方法区中把类创建出来,里面的每一个实例都会放在堆中,堆中结构是对象头+实例数据。
对于数据的引用保存在栈中。
3.Java内存模型
什么叫JMM?全称Java Memory Model。c语言不存在内存模型的概念,依赖处理器,不同处理器结果不一样,无法保证并发安全。
JMM是一组规范,以便于更方便的开发多线程程序。volatile,synchronized,lock等的原理都是JMM。最重要的三点:重排序,可见性,原子性。
1.重排序
对代码进行优化,提高处理速度。 发生在编译器优化,CPU指令重排,内存的“重排序”。
2.可见性
CPU有多极缓存,导致读的数据过期。会有可见性问题。
Happens-Before规则:1.单线程规则2.锁操作(synchronized和lock)3.volatile变量 4.线程启动 5.线程join 6.传递性 7.中断 8.构造方法 9.工具类的Happens-Before原则
volatile:同步机制,更轻量,不会发生上下文切换,开销笑。
synchronized不仅能保证原子性,还能保证可见性。
3.原子性
要么全部执行,要么全部不执行