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

 更新时间:2022年07月31日 08:26:50   作者:树獭叔叔  
这篇文章主要介绍了JVM 运行时数据区与JMM 内存模型,文章围绕主题展开详细的内容介绍,具有一定的参考价值。需要的朋友可以参考一下

1. JVM 运行时数据区

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

  • 元空间(方法区):存放类模版对象,是线程共享的区域,在磁盘上,一般不会GC
  • 堆空间:线程共享的区域,对象创建与GC的主要阵地
  • 虚拟机栈:线程私有的,基本组成单位是栈帧,每个栈帧对应一个方法,栈帧组成如下
    • 局部变量表:存放方法变量信息
    • 操作数栈:方法运行的区域
    • 动态链接:指向方法模板对象,与虚方法表一起实现方法重写
    • 返回地址:方法的返回地址
  • 本地方法栈:线程私有,本地方法的执行区域
  • 程序计数器:线程私有,负责在线程上下文切换的过程中记录线程执行到了哪个位置

2. JMM 内存模型

硬件内存模型

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

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

JMM

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

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

3. 可见行与 volatile 关键字

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

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

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

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

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

  • loadload:两个读取操作之间
  • storestore:两个写操作之间
  • loadstore:读写操作之间
  • storelosd:写读操作之间

到此这篇关于JVM 运行时数据区与JMM 内存模型的文章就介绍到这了,更多相关JMM 内存模型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java使用软引用实现缓存机制示例

    java使用软引用实现缓存机制示例

    这篇文章主要为大家介绍了java使用软引用实现缓存机制示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • SpringBoot通过自定义注解实现参数校验

    SpringBoot通过自定义注解实现参数校验

    实现参数校验说实话方式还挺多,个人使用过直接在Controller代码里面写、AOP+自定义注解、ConstraintValidator。本文主要和大家讲的是ConstraintValidator实现,感兴趣的可以了解一下
    2022-12-12
  • 深入理解java内置锁(synchronized)和显式锁(ReentrantLock)

    深入理解java内置锁(synchronized)和显式锁(ReentrantLock)

    这篇文章主要介绍了Java多线程之内置锁(synchronized)和显式锁(ReentrantLock)的深入理解新的和用法,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java String类详解_动力节点Java学院整理

    Java String类详解_动力节点Java学院整理

    这篇文章主要介绍了Java String类详解,本文经多方资料的收集整理和归纳,最终撰写成文,非常不错,值得收藏,需要的的朋友参考下
    2017-04-04
  • SpringBoot项目Docker部署三种方式

    SpringBoot项目Docker部署三种方式

    本文主要介绍了SpringBoot项目Docker部署三种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • springboot实现定时任务@Scheduled方式

    springboot实现定时任务@Scheduled方式

    这篇文章主要介绍了springboot实现定时任务@Scheduled方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java BOI与NIO超详细实例精讲

    Java BOI与NIO超详细实例精讲

    在Java的软件设计开发中,通信架构是不可避免的,我们在进行不同系统或者不同进程之间的数据交互,或者在高并发下的通信场景下都需要用到网络通信相关的技术,对于一些经验丰富的程序员来说,Java早期的网络通信架构存在一些缺陷,这篇文章介绍Java BOI与NIO
    2022-11-11
  • SpringBoot结合Neo4j自定义cypherSql的方法

    SpringBoot结合Neo4j自定义cypherSql的方法

    这篇文章主要介绍了SpringBoot结合Neo4j自定义cypherSql,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • 设计模式之责任链模式_动力节点Java学院整理

    设计模式之责任链模式_动力节点Java学院整理

    这篇文章主要为大家详细介绍了设计模式之责任链模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Java计算交集,差集,并集的方法示例

    Java计算交集,差集,并集的方法示例

    这篇文章主要介绍了Java计算交集,差集,并集的方法,结合实例形式简单分析了java集合运算的简单操作技巧,需要的朋友可以参考下
    2017-10-10

最新评论