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

作者:树獭叔叔 时间:2022-08-12 10:49:27 

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:写读操作之间

来源:https://juejin.cn/post/7126213567900024839

标签:JVM,运行,数据区,JMM,内存,模型
0
投稿

猜你喜欢

  • Java访问Hadoop分布式文件系统HDFS的配置说明

    2021-11-20 05:53:42
  • SpringBoot中的Thymeleaf用法

    2023-10-30 17:30:39
  • 详解Spring Boot自动装配的方法步骤

    2023-11-18 15:02:18
  • 基于<aop:aspect>与<aop:advisor>的区别

    2023-01-22 21:53:35
  • SpringBoot整合Apollo配置中心快速使用详解

    2022-12-25 17:00:34
  • Java线程通信之wait-notify通信方式详解

    2022-05-17 19:35:46
  • Java五种方式实现多线程循环打印问题

    2023-03-07 20:34:12
  • Java中ArrayList的工作原理详解

    2021-12-18 08:01:45
  • Spring JPA之save方法示例详解

    2023-09-06 15:50:35
  • ReadWriteLock接口及其实现ReentrantReadWriteLock方法

    2023-11-24 01:46:52
  • java内部类的定义与分类示例详解

    2022-07-01 20:16:47
  • Java中接收键盘输入的三种方法

    2023-11-13 16:11:29
  • 第一次编写Java流布局图形界面

    2023-10-13 08:27:11
  • SpringBoot使用AOP+注解实现简单的权限验证的方法

    2022-07-29 00:59:09
  • Springboot中加入druid连接池

    2023-08-08 05:47:22
  • Java内存区域与内存溢出异常详解

    2022-09-10 17:01:19
  • C#语言主要语言区域

    2021-10-05 13:58:38
  • 基于Spring Security前后端分离的权限控制系统问题

    2022-10-16 21:32:39
  • Spring 整合 MyBatis的实现步骤

    2022-08-21 16:51:14
  • 学会使用C#异常

    2021-08-17 23:31:19
  • asp之家 软件编程 m.aspxhome.com