JVM内存结构、内存模型,JAVA对象模型

今天在简书上看到一篇博文,讲解了JVM内存结构/内存模型以及JAVA对象模型这三个概念之间的区别,在此做一个记录:

(1)JVM内存结构:
   此概念与我们通常讲的JVM内存区域的划分是同一个概念:JVM在运行过程中会将内存分为堆、栈、方法区等五个部分,各个内存区域在程序过程中存储不同的数据,各有各的作用……巴拉巴拉,网上关于这个概念的讲解也太多了,以后会写一篇专门的博文来叙述这个概念,此处不多介绍,仅为区别以上三者概念。
     这里写图片描述
(2)JVM内存模型:
   这个概念是与多线程相关的概念,我们都知道在多线程运行环境中,堆内存和方法区是线程之间共享的内存区域,多线程之间通过这两块内存中的共享数据进行通信。多线程都可以对共享数据进行访问或者修改,这就不可避免的涉及到原子性、可见性、顺序性等问题,反映到我们的程序中就是synchronized等关键字的使用,对多线程访问进行一些限制、保证数据的安全性。JVM内存模型(JMM)就是鉴于此抽象出来的一个概念:我们将多线程共享的内存区域成为主内存,各线程在共享主内存的同时会各自维护一个本地内存,用于存储主内存中共享数据的副本,但是这个本地内存只是抽象的概念,并不真实存在,但是很重要,正是JMM的存在,才保证了并发编程的安全性、可行性。如下图:
            这里写图片描述
(3)JAVA对象模型:
   JAVA对象模型指的是JAVA对象本身在JVM中的存储模型。
   HotSpot虚拟机中,设计了一个OOP-Klass Model。OOP(Ordinary Object Pointer)指的是普通对象指针,而Klass用来描述对象实例的具体类型。每一个Java类,在被JVM加载的时候,JVM会给这个类创建一个instanceKlass,保存在方法区(可以理解为.class文件),用来在JVM层表示该Java类。我们在Java代码中,使用new创建一个对象的时候,JVM会创建一个instanceOopDesc对象,这个对象中包含了对象头以及实例数据等。(补充:HotSpot虚拟机的对象头包括两部分信息,第一部分用于存储对象自身的运行时数据, 如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等;另外一部分是类型指针,即是对象指向它的类的元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。)
   这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_29468573/article/details/80852960
今日推荐