前面几篇文章中, 系统的学习了下JVM内存结构、Java内存模型、Java对象模型, 但是发现自己还是对这三者的概念和区别比较模糊, 傻傻分不清楚。所以就有了这篇文章, 本文主要是对这三个技术点再做一个总结和区分, 加深印象。
JVM内存结构
在《Java虚拟机规范(Java SE 8)》中描述了JVM运行时内存区域结构如下:
也就是说, JVM内存结构由Java虚拟机规范定义, 其描述的是Java程序执行过程中, 由JVM管理的不同的数据区域。
Java内存模型
在计算机世界中, 为了保证共享内存的正确性(原子性、可见性、有序性), 内存模型定义了共享内存系统中多线程程序读写操作行为的规范。通过这些规则来规范对内存的读写操作, 从而保证指令执行的正确性。它与处理器有关、与缓存有关、与并发有关、有编译有关。它解决了CPU多级缓存、处理器优化、指令重排等导致的访问问题, 保证了并发场景下的有序性、一致性、原子性。
内存模型解决并发问题主要采用两种方式: 限制处理器优化和使用内存屏障。
我们知道, Java的多线程之间是通过共享内存进行通信的, 而由于采用共享内存进行通信, 在通信过程中会存在一系列如可见性、原子性、顺序性等问题, 而JMM(Java Memory Model)就是围绕着多线程通信以及与其相关的一系列特性而建立的模型。它只是一个抽象的概念, 是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范。JMM定义了一些语法集, 这些语法集映射到Java语言中就是volatile、synchronized等关键字。
Java对象模型
Java是一种面向对象的语言,而Java对象在JVM中的存储也是有一定的结构的。而这个关于Java对象自身的存储模型称之为Java对象模型。
HotSpot虚拟机中,设计了一个OOP-Klass Model。OOP(Ordinary Object Pointer)指的是普通对象指针,而Klass用来描述对象实例的具体类型。
如下图所示, 就是一个简单的Java对象的OOP-Klass模型,即Java对象模型。
小结
最后, 我们再对这三个概念做一个简单的区分。JVM内存结构, 和Java虚拟机的运行时区域有关。Java内存模型, 和Java的并发编程有关。Java对象模型, 和Java对象在虚拟机中的表现形式有关。