Java内存结构,内存模型和对象模型

4 篇文章 0 订阅

转载:https://cloud.tencent.com/developer/article/1467468

Java作为一种面向对象的,跨平台语言,其对象,内存等都是一直比较难的知识点,而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构,Java内存模型和Java对象模型,这就是三个截然不同的概念,但是很多人容易弄混。

首先,这三个概念是完全不同的三个概念。本文主要对这三个概念加以区分以及简单介绍。

JVM内存结构

我们都知道,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途。

其中有些区域随着虚拟机进程的启动而存在,而有些区域则依赖用户线程的启动而建立,随着线程的结束而销毁。在《Java虚拟机规范(Java SE 8)》中描述了JVM运行时内存区域结构如下:
在这里插入图片描述
各个区域的功能不是本文重点,就不在这里详细介绍了。这里简单提几个需要特别注意的点:

  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内存模型看上去和Java内存结构(JVM内存结构)差不多,很多人会误以为两者是一回事儿,其实这两者并不是同一概念,甚至这两者之间是没有任何关系的。

在前面的关于JVM内存结构的图中,我们可以看到,其中Java堆和方法区的区域是多个线程共享的数据区域。也就是说,多个线程可能可以操作保存在堆或者方法区中的同一个数据。这也就是我们常说的“Java的线程间通过共享内存进行通信”。

JMM并不像JVM内存结构一样是真实存在的。他只是一个抽象的概念。JSR-133:Java Memory Model and Thread Specification 中描述了,JMM是和多线程相关的,他描述了一组规则或规范,这个规范定义了一个线程对共享变量的写入时对另外一个线程是可见的。

那么,简单总结下,Java多线程之间是通过共享内存进行通信的,而由于采用共享内存进行通信,在通信过程中会存在一系列如可见性,原子性,顺序性等问题,而JMM就是围绕着多线程通信以及其相关的一系列特性建立的模型。

JMM定义了一些语法集,这些语法集映射到Java语言中就是volatilesynchronized等关键字。

在JMM中,我们把多个线程间通信的共享内存称之为主内存,而在并发编程中多个线程都维护了一个自己的本地内存(这是一个抽象概念),其中保存的数据是主内存中的数据拷贝。而JMM主要是控制本地内存和主内存之间的数据交互的。
在这里插入图片描述
在Java中,JMM是一个非常重要的概念,正是有了JMM,Java的并发编程才能避免很多问题。这里就不对Java内存模型做更加详细的介绍了,想了解更多的朋友可以参考《Java并发编程的艺术》。

Java对象模型

Java是一种面向对象的语言,而Java对象在JVM中的存储也是有一定的结构的。而这个关于Java对象自身的存储模型称为Java对象模型。

HotSpot虚拟机中,设计了一个OOP-Klass Model。OOP(Ordinary Object Pointer) 指的是普通对象指针,而Klass用来描述对象实例的具体类型。

每一个Java类,在被JVM加载的时候,JVM会给这个类创建一个instanceKlass,保存在方法区,用来在JVM层表示该Java类。当我们在Java代码中,使用new创建一个对象的时候,JVM会创建一个instanceOopDesc对象,这个对象中包含了对象头以及实例数据。
在这里插入图片描述
这就是一个简单的Java对象的OOP-Klass模型,即Java对象模型。
在这里插入图片描述
这就是一个简单的Java对象的OOP-Klass模型,即Java对象模型。

总结一下

我们再来区分下Java内存结构,内存模型和对象模型这个三个概念

  • Java内存结构和Java虚拟机的运行时区域有关。
  • Java内存模型和Java的并发编程有关。
  • Java对象模型和Java对象在虚拟机中的表现形式有关。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值