JVM内存结构:和Java虚拟机的运行时区域有关。
Java对象模型:和Java对象在虚拟机中的表现形式有关。
Java内存模型:和Java的并发编程有关。
Java对象模型就是Java对象自身的存储模型。
JVM会给这个类创建一个instanceKlass,保存在方法区,用来在JVM层表示该Java类。
当我们在Java代码中,使用new创建一个对象的时候,JVM会创建一个instanceOopDesc对象,这个对象中包含了对象头以及实例数据。
回顾一下Java程序的编译与运行,从Java代码到CPU指令的过程如下图所示。
.java
文件.java
文件会变出一个新的Java字节码文件.class
.class
,并把字节码文件转化为机器指令由上述过程可知,JVM实现会带来不同的“翻译”,不同的CPU平台的机器指令又千差万别,无法保证并发安全的效果一致。因此,需要一个标准(转化过程的规范、原则),让多线程运行的结果可预期。
Java内存模型(Java Memory Model, JMM)是一组规范,需要各个JVM的实现来遵守JMM规范,以便于开发者可以利用这些规范,更方便地开发多线程程序。
如果没有这样的一个JMM内存模型来规范,那么很可能经过了不同JVM的不同规则的重排序之后,导致不同的虚拟机上运行的结果不一样,那是很大的问题。
volatile、synchronized、Lock等的原理都是JMM。
如果没有JMM,那就需要我们自己指定什么时候用内存栅栏等,那是相当麻烦的,幸好有了JMM,让我们只需要用同步工具和关键字就可以开发并发程序。
重排序:Java内存模型之重排序
可见性:Java内存模型之可见性
原子性:Java内存模型之原子性