JVM内存结构、Java内存模型和Java对象模型是截然不同的三种概念。
1. JVM内存结构
Java程序执行过程中,内存会被划分为不同的数据区域,各个区域有各自的用途。
- 有些区域随虚拟机的启动而存在
- 有些区域随线程的启动而启动,随线程的结束而销毁
需要注意的点
- Java虚拟机规范,不同的虚拟机实现可能不同,但是一般都会遵守规范
- 规范中方法区只是一种概念上的区域,说明了其应该具有的功能,但并没有说明其具体应该位于何处。不同的虚拟机实现,会有一定的自由度。有些虚拟机是在堆内实现的
- 运行时常量池用于存放编译期的各种字面值和符号引用。不过Java并没有要求常量只能在编译期才能产生,通过String.intern也能产生
- 除了图中所列的内存区域,还有一块内存可供使用,那就是直接内存。JVM规范并没有定义这一块区域,所以并不由JVM管理,是利用本地方法库直接在堆外申请的内存
- 堆和栈的数据划分并不是绝对的,JIT会针对对象分配做一定的优化
JVM内存结构由JVM虚拟机规范定义。描述的是java程序执行过程中,由JVM管理的不同数据区域,各个区域的功能会有区别。
2. Java内存模型
Java堆和方法区是多个线程共享的数据区域。多个线程可以操作堆和方法区中的同一个数据。Java的线程间通过共享内存进行通信
Java内存模型的英文名称为Java Memory Model(JMM),其并不想JVM内存结构一样真实存在,而是一个抽象的概念。通过JSR-133 Java Memory Model and Thread Specification中的描述,我们知道JMM和线程有关,它描述了一组规范或规则,一个线程对共享变量的写入时对另一个线程是可见的。
Java多线程对共享内存进行操作的时候,会存在一些如可见性、原子性和顺序性的问题,JMM是围绕着多线程通信及相关的一些特性而建立的模型。而JMM定义了一些语法集,而这些语法集映射到Java语言的volatile、synchronized等关键字
3. Java对象模型
Java对象在JVM中的存储有一定的结构,Java对象自身的存储模型就叫做Java对象模型。
总结
JVM内存结构,和Java虚拟机的运行时区域有关。 Java内存模型,和Java的并发编程有关。 Java对象模型,和Java对象在虚拟机中的表现形式有关。