JVM内存结构 VS Java内存模型 VS Java对象模型
JVM内存结构(JVM内存分区
图解
Java代码运行在JVM虚拟机上,虚拟机在执行Java程序的过程中把所管理的内存划分为上述的不同数据区域,每个区域拥有自己的功能。
1、以上是Java虚拟机规范,不同的虚拟机实现会各有不同,但是一般会遵守规范。
2、规范中定义的方法区,只是一种概念上的区域,并说明了其应该具有什么功能。但是并没有规定这个区域到底应该处于何处。所以,对于不同的虚拟机实现来说,是由一定的自由度的。
3、不同版本的方法区所处位置不同,上图中划分的是逻辑区域,并不是绝对意义上的物理区域。因为某些版本的JDK中方法区其实是在堆中实现的。
4、运行时常量池用于存放编译期生成的各种字面量和符号应用。但是,Java语言并不要求常量只有在编译期才能产生。比如在运行期,String.intern也会把新的常量放入池中。
5、除了以上介绍的JVM运行时内存外,还有一块内存区域可供使用,那就是直接内存。Java虚拟机规范并没有定义这块内存区域,所以他并不由JVM管理,是利用本地方法库直接在堆外申请的内存区域。
6、堆和栈的数据划分也不是绝对的,如HotSpot的JIT会针对对象分配做相应的优化。
如上,做个总结,JVM内存结构,由Java虚拟机规范定义。描述的是Java程序执行过程中,由JVM管理的不同数据区域。各个区域有其特定的功能。
Java内存模型(Java Memory Model(JMM))
Java内存模型和JVM内存结构很像,但是JVM内存结构虽然可能具体实现有所不同,但是确实是真实存在的。
而Java内存模型则是为了方便程序员编程和理解抽象而出的概念,讲述了多线程的运行情况如何处理共享资源线程运行模型或者说这是一个规范,定义了一个线程对共享变量的写入时对另一个线程是可见的
图解
Java对象模型
Java是面向对象的语言,Java对象模型是一个Java对象如何存储在jvm虚拟机中的描述
图解
如上图所示
primitive基本类型和引用(指针、句柄)存储在栈中
基本数据类型的存储到此为止,但是对象的具体数据则是存储在堆中的,堆中存储的是对象实例。在对象实例中包含一个元数据指针,该指针指向了方法区。在方法区保存了类信息
参考:https://www.hollischuang.com/archives/2509 欢迎大家阅读原文