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