当前位置:网站首页>JVM 运行时数据区与JMM 内存模型详解
JVM 运行时数据区与JMM 内存模型详解
2022-07-31 11:53:00 【Trouvailless】
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:写读操作之间
边栏推荐
- 生命不息,刷题不止,简单题学习知识点
- 三层架构service、dao、controller层
- St. Regis Takeaway Project: New dishes and dishes paged query
- 结构化查询语言SQL-关系数据库标准语言
- 荣耀手机参数写错,客服认为没错
- strings包详细文档+示例
- 学习爬虫之Scrapy框架学习(1)---Scrapy框架初学习及豆瓣top250电影信息获取的实战!
- The latest MySql installation teaching, very detailed
- MySQL 的 limit 分页查询及性能问题
- Initial JDBC programming
猜你喜欢
才22岁!这位'00后'博士拟任职985高校!
Docker installs canal and mysql for simple testing and achieves cache consistency between redis and mysql
拥抱趋势!阿里这套微服务开源框架权威手册,实战到底层细致清晰
apisix-入门使用篇
[Virtualization Ecological Platform] Platform Architecture Diagram & Ideas and Implementation Details
502 bad gateway causes and solutions
下课看着文档走回实验室,我重新拾起了遗忘的SQL运算符
LeetCode 1161.最大层内元素和:层序遍历
ApiPost 真香真强大,是时候丢掉 Postman、Swagger 了
WebGL给Unity传递参数问题1: Cannot read properties of undefined (reading ‘SendMessage‘)
随机推荐
Initial JDBC programming
cesium-Web网页优化进阶
[Virtualization ecological platform] Raspberry Pi installation virtualization platform operation process
一文吃透接口调用神器RestTemplate
Threading(in thread main)
mysql 索引使用与优化
After Effects 教程,如何在 After Effects 中修复曝光不足的镜头?
LeetCode 1161.最大层内元素和:层序遍历
在 Excel 内使用 ODBC 消费 SAP ABAP CDS view
连续变量离散化教程
MySQL limit paging query and performance issues
线程池 ThreadPoolExecutor 详解
WebGL给Unity传递参数问题1: Cannot read properties of undefined (reading ‘SendMessage‘)
数据湖(十九):SQL API 读取Kafka数据实时写入Iceberg表
应用层基础 —— 认识URL
才22岁!这位'00后'博士拟任职985高校!
分布式事务Seata详细使用教程
If the value of the enum map does not exist, deserialization is not performed
Docker installs canal and mysql for simple testing and achieves cache consistency between redis and mysql
Is the working process of the belt you know the story - actionreducerstore