Java 内存模型和 JVM 内存结构真不是一回事

是一种抽象的计算机,基于堆栈架构,它有自己的指令集和内存管理。内存结构有何不同。不说,先来看下内存模型是什么?意思就是,在计算中,内存模型描述了多线程如何正确的通过内存进行交互和使用共享数据。内存模型在处理器级别,为处理器彼此之间对内存写入结果的可见性,定义了充分必要条件:JMM)就是在底层处理器内存模型的基础上,定义自己的多线程语义。内存模型约定的多线程语义。

以下为知识DOC为大家进行整理的相关内容,希望对大家有所帮助!

这两个概念估计有不少人会混淆,它们都可以说是 JVM 规范的一部分,但真不是一回事!它们描述和解决的是不同问题,简单来说,

JVM 是什么呢?它屏蔽了底层架构的差异性,是 Java 跨平台的依据,也是每个 Java 程序员必须了解的一部分。

JVM 体系结构

Java (JVM) 是一种抽象的计算机,基于堆栈架构jvm是什么意思,它有自己的指令集和内存管理。它加载 class 文件,分析、解释并执行字节码。基本结构如下:

一月一日是元旦节 元是第一的意思_悄悄是别离的笙箫沉默是今晚的康桥意思_jvm是什么意思

如上图所示,JVM 主要分为三个子系统:类加载器、运行时数据区和执行引擎。

类加载器子系统

它主要功能是处理类的动态加载,还有链接,并且在第一次引用类时进行初始化。

– 加载,顾名思义jvm是什么意思,用于加载类,它有三种类加载器,根据双亲委托模型,从不同路径进行加载:

– 链接,动态链接到运行时所需的资源,分为三步:

– 类初始化,类加载的最后阶段jvm是什么意思,这里对静态变量进行赋值,并执行静态块。(注意区分对象初始化)

运行时数据区

它约定了在运行时程序代码的数据比如变量、参数等等的存储位置,主要包含以下几部分:

执行引擎

运行时数据区存储着要执行的字节码,执行引擎将会读取并逐个执行。

– 解释器,它对字节码的解释很快,但执行慢,有个缺点是,当方法被多次调用时,每次都需要重新解释。

JIT – JIT编译器, 解决了解释器的缺点,仍使用解释器来转换字节代码,但发现有代码重复执行时,会使用 JIT 编译器,将整个字节码编译成本地代码,将本地代码用于重复调用,从而提高系统的性能,有以下几部分组成:

– 垃圾收集器,收集和删除未引用的对象。

另外,还包括执行引擎所需的本地库( )和与其交互的 JNI 接口(Java )。

现在来看下 Java 内存模型和 JVM 内存结构有何不同。

JVM 内存结构

常说的 JVM 内存结构指的就是上文提交到运行时数据区,其中堆、方法区被线程共享,程序计数器、栈、运行时常量池被线程独享。

它描述的是,在运行时,字节码和代码数据存储的位置。

内存模型

先抛开 Java 不说,先来看下内存模型是什么?维基百科中的定义:

In , a model the of and their use of the data.

意思就是,在计算中,内存模型描述了多线程如何正确的通过内存进行交互和使用共享数据。换句话说,内存模型约束了处理器对内存的读写。

一月一日是元旦节 元是第一的意思_悄悄是别离的笙箫沉默是今晚的康桥意思_jvm是什么意思

CPU 和内存之间通常会存在一层或多层高速缓存,这对单处理器可能没问题,但在多处理器系统中,可能就会出现缓存一致性问题,也就是当两个处理器(线程)同时读取相同内存位置会发生什么?什么情况下会看到相同的值?

缓存一致性问题,在并发编程中,又被称作可见性问题。内存模型在处理器级别,为处理器彼此之间对内存写入结果的可见性,定义了充分必要条件:

大多数处理器不会限制内存操作的顺序,多线程在执行时可能会出现让人困惑和违背直觉的结果。这是因为 CPU 为了充分利用不同类型存储器(寄存器、高速缓存、主存)的总线带宽,会将内存操作重新排序,以无序执行,这个动作称为内存排序或指令重排序。

重排序,也被称为编译器优化和处理器优化,因为它既可以发生在编译期间,也可以发生在 CPU 运行时。为了保证多线程的有序性,需要使用内存屏障禁止重排序。

所以说,内存模型就是在硬件层面描述了使用内存屏障(刷新缓存或禁用指令重排序)解决多线程编程中的可见性和有序性的问题。

Java 内存模型

Java 内存模型(下文简称 JMM)就是在底层处理器内存模型的基础上,定义自己的多线程语义。它明确指定了一组排序规则,来保证线程间的可见性。

这一组规则被称为 -, JMM 规定,要想保证 B 操作能够看到 A 操作的结果(无论它们是否在同一个线程),那么 A 和 B 之间必须满足 – 关系:

怎么理解 – 呢?如果按字面意思,比如第二个规则,线程(不管是不是同一个)的解锁动作发生在锁定之前?这明显不对。- 也是为了保证可见性,比如那个解锁和加锁的规则,可以这样理解,线程1释放锁退出同步块,线程2加锁进入同步块,那么线程2就能看见线程1对共享对象修改的结果。

Java 提供了几种语言结构,包括 , final 和 , 它们旨在帮助程序员向编译器描述程序的并发要求,其中:

编译器在遇到这些关键字时,会插入相应的内存屏障,保证语义的正确性。

有一点需要注意的是, 不保证同步块内的代码禁止重排序,因为它通过锁保证同一时刻只有一个线程访问同步块(或临界区),也就是说同步块的代码只需满足 as-if- 语义 – 即只要单线程的执行结果不改变,可以进行重排序。

所以说,Java 内存模型描述的是多线程对共享内存修改后彼此之间的可见性,另外,还确保正确同步的 Java 代码可以在不同体系结构的处理器上正确运行。

小结

它们之间的关系可以这样来个总结,实现一个 JVM 要满足内存结构描述的组成部分,设计如何执行多个线程的时候,要满足Java 内存模型约定的多线程语义。

本文地址: https://www.zhishidoc.com/22849.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 859089669@qq.com 举报,一经查实,本站将立刻删除。

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年10月25日 上午5:37
下一篇 2022年10月25日 上午5:46

相关推荐

  • 侄子结婚贺词

    无论是身处学校还是步入社会,大家都用到过贺词吧,贺词是喜庆的仪式上所说的表示祝贺的话。大家好,今天是郭xxx先生和杜xxx女士喜结良缘的大好日子,首先请允许我代表所有的嘉宾向他们致以最热烈的祝贺!第二,今天是个好日子,让我们用最热烈的掌声向今天的一对新人表示最真诚的祝福,祝他们相亲相爱、生活美满、幸福一生!【侄子结婚贺词】相关文章:儿女结婚贺词01-22朋友结婚祝贺词-结婚祝福语12-22

    2022年11月7日
    13700
  • 好听的名字大全|儿童英文名字男孩,英语名字男孩大全好听

    01、drew(徳鲁)——将drew作为男孩儿的名字,音标为[dru:],发音非常的简单。02、mason(梅森)——mason这个名字源自于法语,常见于国外男艺人的名字中,用来作为男孩儿的名字很合适。因此,将其作为男孩儿的英文名字非常的合适,其中文音译为“卡尔”,发音非常的好听,简短易读。最好听的12个男生英文名,你喜欢哪个女生也来围观一下,看看哪个男生的英文名最好听哦!

    2022年10月9日
    15300
  • 祝老公生日的简单祝福怎么说

    老公生日的时候要帮他准备满意的生日礼物,但是只有礼物的生日是不完整的,甜蜜的祝福情话也是不可缺少,所以小编今天就带大家来看看祝老公生日的简单祝福怎么说?一、祝老公生日的简单祝福怎么说二、发朋友圈祝福老公生日怎么说三、老公生日低调发朋友圈说什么好亲爱的,在你生日到来之际,送上我最最贴心的祝福,有我在的日子,你永远不会伤心难过!以上不同的祝福老公生日的祝福语,还够用吗?

    2022年10月30日
    15300
  • 茶的唯美诗词

    诗词,是指以古体诗、近体诗和格律词为代表的中国汉族传统诗歌。通常认为,诗较为适合“言志”,而词则更为适合“抒情”。茶的唯美诗词1茶的唯美诗词2茶的唯美诗词345、野泉烟火白云间关于茶的古诗,坐饮香茶爱此山。【茶的唯美诗词】相关文章:关于茶的诗词09-04苏轼写茶的诗词03-27与茶有关的诗词名句10-06咏茶的诗词名句12-15古代关于茶的诗词09-02茶的唯美诗词相关文章:

    投稿 2022年10月20日
    16300
  • 一则盘点|组合名字&粉丝名,你都知道是什么意思吗?(下)

    Apink:Apink以前经纪人的昵称为功夫熊猫,跟她们关系特别好,后来粉丝名就定为粉红熊猫在看起来很美的粉色中稍微加入了否定的意义,旨在传达出“不要只看漂亮的部分”、“看到的并不是全部”的意思one,也有成员中B型血1名,A型血4名的意思BANA:韩语中“陷入了”发音为“”,因此粉丝名为BANA,陷入了B1A4之意:仙后座()每个季节都在同一个位置上,寓意粉丝们永远都会在东方神起身边

    2022年10月25日
    12200

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注