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

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

这篇“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内存模型是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注恰卡网行业资讯频道。

    本站部分文章来自网络或用户投稿,如无特殊说明或标注,均为本站原创发布。涉及资源下载的,本站旨在共享仅供大家学习与参考,如您想商用请获取官网版权,如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
    开发者

    iOS开发多线程下全局变量赋值崩溃原理是什么

    2022-8-3 21:09:43

    开发者

    Golang协程调度器scheduler怎么使用

    2022-8-3 21:10:03

    搜索