热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

JVM运行时数据区与JMM内存模型是什么

这篇“JVM运行时数据区与JMM内存模型是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借

这篇“JVM运行时数据区与JMM内存模型是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JVM运行时数据区与JMM内存模型是什么”文章吧。

    1. JVM 运行时数据区

    JVM运行时数据区可以分为元空间,堆,虚拟机栈,本地方法栈,程序计数器五大块。

    JVM运行时数据区与JMM内存模型是什么

    • 元空间(方法区):存放类模版对象,是线程共享的区域,在磁盘上,一般不会GC

    • 堆空间:线程共享的区域,对象创建与GC的主要阵地

    • 虚拟机栈:线程私有的,基本组成单位是栈帧,每个栈帧对应一个方法,栈帧组成如下

      • 局部变量表:存放方法变量信息

      • 操作数栈:方法运行的区域

      • 动态链接:指向方法模板对象,与虚方法表一起实现方法重写

      • 返回地址:方法的返回地址

    • 本地方法栈:线程私有,本地方法的执行区域

    • 程序计数器:线程私有,负责在线程上下文切换的过程中记录线程执行到了哪个位置

    2. JMM 内存模型

    硬件内存模型

    JVM运行时数据区与JMM内存模型是什么

    通常情况下,当CPU需要读取主存时,它会将主存的部分读到CPU缓存中或者内部寄存器中,然后在寄存器中执行操作。当CPU需要将结果写回到主存中去时,它会将内部寄存器的值刷新到缓存中,然后在某个时间点将值刷新回主存。

    在多处理器系统中,每个处理器都有自己的高速缓存,而它们又共享同一主内存,因此就会存在缓存一致性问题。为了解决一致性的问题,需要各个处理器访问缓存时都遵循一些协议,在读写时要根据协议来进行操作,这类协议有MSI、MESI等。

    JMM

    JMM内存模型将内容分为了线程私有内存与主内存两部分,其与我们之前提到的硬件内存模型的对应关系如下所示:

    JVM运行时数据区与JMM内存模型是什么

    私有内存与主内存的交互由如下八种操作控制:

    JVM运行时数据区与JMM内存模型是什么

    3. 可见行与 volatile 关键字

    一言以蔽之,volatile 关键字通过内存屏障的形式来阻止指令重排,以维护变量的有序性与可见行。

    一行代码到执行的过程中要经历以下的阶段:

    JVM运行时数据区与JMM内存模型是什么

    volatile 关键字有如下两个作用:

    • 保证被 volatile 修饰的共享变量对所有线程总是可见的,也就是当一个线程修改了被 volatile 修饰共享变量的值,新值总是可以被其他线程立即得知。

    • 禁止指令重排序优化。

    JVM中提供了四类内存屏障指令:

    • loadload:两个读取操作之间

    • storestore:两个写操作之间

    • loadstore:读写操作之间

    • storelosd:写读操作之间

    以上就是关于“JVM运行时数据区与JMM内存模型是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程笔记行业资讯频道。


    推荐阅读
    • Spring Cloud因其强大的功能和灵活性,被誉为开发分布式系统的‘一站式’解决方案。它不仅简化了分布式系统中的常见模式实现,还被广泛应用于企业级生产环境中。本书内容详实,覆盖了从微服务基础到Spring Cloud的高级应用,适合各层次的开发者。 ... [详细]
    • PySpark实战:高效使用DataFrame超越RDD
      本文深入探讨了PySpark中DataFrame的使用方法及其相对于传统RDD的优势,旨在帮助开发者更好地理解和利用这一强大工具。 ... [详细]
    • 收割机|篇幅_国内最牛逼的笔记,不接受反驳!!
      收割机|篇幅_国内最牛逼的笔记,不接受反驳!! ... [详细]
    • 深入理解Java内存模型的核心原则
      本文详细解析了Java内存模型(JMM)的核心原则,包括原子性、可见性和有序性,并探讨了JMM如何通过特定机制保证这些特性,为开发者提供多线程编程的指导。 ... [详细]
    • 微型计算机主机的关键组件解析
      本文详细探讨了微型计算机主机的核心组成部分,包括微处理器、内存储器、输入输出接口等,并解释了这些部件如何协同工作以构建一个完整的微型计算机系统。 ... [详细]
    • 本文将详细介绍NSRunLoop的工作原理,包括其基本概念、消息类型(事件源)、运行模式、生命周期管理以及嵌套运行等关键知识点,帮助开发者更好地理解和应用这一重要技术。 ... [详细]
    • MyBatis 开发技巧:延迟加载与查询缓存详解
      本文详细探讨了 MyBatis 中的延迟加载和查询缓存机制,旨在帮助开发者更好地理解和利用这些特性来优化数据库访问性能。 ... [详细]
    • 加速(Speedup)是在多核心CPU机器上运行应用程序(相比单核心CPU机器)所能够预期的性能效益。测量加速时,是以单核心CPU机器的性能为基线。当然,你可能会认为同一个App(应用程序)在双核心C ... [详细]
    • 计算机架构基础 —— 冯·诺依曼模型
      本文探讨了计算机科学的基础——冯·诺依曼体系结构,介绍了其核心概念、发展历程及面临的挑战。内容涵盖早期计算机的发展、图灵机的概念、穿孔卡的应用、香农定理的重要性以及冯·诺依曼体系结构的具体实现与当前存在的瓶颈。 ... [详细]
    • 深入解析 Golang 中的 Cache::remember 方法实现
      本文详细探讨了如何在 Golang 中实现类似于 Laravel 的 Cache::remember 方法,通过具体的代码示例和深入的分析,帮助读者更好地理解和应用这一技术。 ... [详细]
    • 深入解析进程、线程与协程的关系及差异
      本文详细探讨了进程、线程和协程这三个概念的基本定义、功能特点以及它们之间的相互关系。通过对比分析,帮助读者更好地理解这三种并行计算模型在实际应用中的选择与运用。 ... [详细]
    • 在Android应用开发过程中,经常需要在SQLite数据库中快速插入大量数据。本文通过实例探讨了不同插入方法的效率,并提供了优化建议。 ... [详细]
    • 免费获取:全面更新的Linux集群视频教程及配套资源
      本资源包含最新的Linux集群视频教程、详细的教学资料、实用的学习课件、完整的源代码及多种软件开发工具。百度网盘链接:https://pan.baidu.com/s/1roYoSM0jHqa3PrCfaaaqUQ,提取码:41py。关注我们的公众号,获取更多更新的技术教程。 ... [详细]
    • 深入理解BIO与NIO的区别及其应用
      本文详细探讨了BIO(阻塞I/O)和NIO(非阻塞I/O)之间的主要差异,包括它们的工作原理、性能特点以及应用场景,旨在帮助开发者更好地理解和选择适合的I/O模型。 ... [详细]
    • 本文详细介绍了如何配置Apache Flume与Spark Streaming,实现高效的数据传输。文中提供了两种集成方案,旨在帮助用户根据具体需求选择最合适的配置方法。 ... [详细]
    author-avatar
    人忒多
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有