简单介绍一下什么是“工作内存”和“主内存”(JMM中的概念)

news/2024/3/29 23:31:05/文章来源:https://blog.csdn.net/wyd_333/article/details/130350402

在学习Java多线程编程里, volatile 关键字保证内存可见性的要点时,看到网上有些资料是这么说的:线程修改一个变量,会把这个变量先从主内存读取到工作内存;然后修改工作内存中的值,最后再写回到主内存

内存可见性问题的表述为:t1 频繁读取主内存,效率比较低,就被优化成直接读自己的工作内存;t2 修改了主内存的结果,但由于 t1 没有读主内存,导致修改不能被识别到,最终导致代码出现bug。

上面这段话中提到的“工作内存”、“主内存”这两个概念,这里作一下简单的介绍。

与我们平时的使用习惯有些不同:“工作内存”指的并不是真正的内存(内存条),而是CPU寄存器与缓存;而“主内存”,才是我们所说的内存条。

这两个词语翻译自英文 work memory(工作内存) 和 main memory(主内存)。但事实上,memory 这个英文单词并不一定就特指内存条,它也可以翻译成“存储区”,单纯地表示“一个用来存储的空间”。不过虽然如此,在进行中文翻译的时候,一般还是将 memory 翻译为“内存”更多一些。因此,work memory 就仍然被翻译为了“工作内存”。

这样一来就容易让我们误会:难道内存条还分为不同的种类,有工作用的内存和主的内存之分吗?其实不然,实际上我们所说的“工作内存”,应该理解为“工作存储区”更合适,它只是CPU寄存器和缓存,而与内存条无关。

上面的这一套的说法,也称为JMM(Java Memory Model),即Java内存模型。JMM的概念来自于 jvm 规范文档,相当于是官方给出的这套说法。

为什么 Java 官方使用的是主内存、工作内存这样自己发明的新术语,而不直接使用 CPU 寄存器,缓存,内存这样更为通用术语呢?主要考虑到的一点是:Java是跨平台的。

Java 是跨平台的,这意味着它必须:

1、兼容多种操作系统。

2、兼容多种硬件设备,尤其是 CPU。

而不同的硬件之间,CPU会有比较大的差异。例如,以前的CPU上只有寄存器,而现在的CPU上除了寄存器,还有缓存;并且有的CPU还有好几个缓存(常见的是三级缓存:L1、L2、L3)。

博主电脑的三级缓存及空间

这样,Java官方文档中要指代相关的概念,如果只提“CPU寄存器”,那就太不严谨了,因为还有各种缓存;如果使用“CPU寄存器和缓存”这一指代,则又过于麻烦。因此,官方干脆发明了一个新的术语:work memory 来代表CPU寄存器和缓存(CPU内部的存储空间)。


下面再简单介绍一下CPU缓存(Cache)。

CPU 读寄存器的速度很快,要比读内存快 3 到 4 个数量级。

缓存的读取速度介于寄存器和内存之间:三级缓存中,L1 最快(仍然比寄存器慢),但空间最小;L3 最慢(仍然比内存快很多),但空间最大。

(任务管理器 -> 性能 中可以查看本机的三级缓存的空间信息。)

实际中, CPU 尝试读一个内存数据,会经历以下步骤:

1、先看看寄存器里有没有;

2、没有,再看下 L1 有没有;

3、没有,再看下 L2有没有;

4、没有,再看下 L3 有没有;

5、没有,再看下内存有没有……

CPU这样做的目标是为了效率更高。CPU访问缓存的速度要比访问内存更快,即使有了上述几个步骤,也要比直接在内存中找数据更快。

缓存的大小对于程序效率的具体影响,也看实际的应用场景。例如,AMD 7950x3D 相比于之前的型号,没有什么大的更改,主要就是提升了 L3 的缓存空间(提升到了256MB)。这样一来,在游戏场景下电脑性能的提升就很大了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_102943.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring 循环依赖处理之三级缓存设计

一、思考 1、Spring是如何解决循环依赖问题的? 2、为什么要使用三级缓存?二级缓存能否解决问题? 3、提前暴露对象暴露的是什么? 4、主要源码 二、循环依赖 1、介绍 如上图,创建A之前需要先创建B,创建B之前需要先创建A,造成循环依赖。 由于A没创建完成&am…

一个关于Mybatis和spring的公共组件starter

utils-springboot-starter 介绍使用说明 介绍 一个关于Mybatis和spring的公共组件starter,目前包含以下功能: 接口请求日志SQL执行日志数据自动加解密数据自动脱敏服务治理方面: 接口限流接口熔断降级:CPU、内存、异常数、异常率…

win11 环境下streamlit使用pycharm debug

目录 1. pycharm中配置run 脚本2. streamlit3. 开始debug调试 1. pycharm中配置run 脚本 (一)点击 Edit Configurations,按图操作. 2. streamlit 1.streamlit 安装在 anaconda 的 base 环境(随意哈,安装哪里都可以&#xff0c…

问题定位及解决方案

1.视频沉浸页快速滑动后,必现不能向下划动 复现步骤: 进入视频沉浸页,快速向下划动,滑动到第一页最后一个时,不能再向下划动。 解决步骤: 1.确定请求API: mtop.aliexpress.ugc.feed.video.lis…

PE文件反编译为python脚本流程

1、查壳 DetectltEasy、PeiD查壳 2、脱壳 常见打包工具PyInstaller,脱壳方法 (1)用pyinstxtractor.py脱壳,用”python pyinstxtractor.py 1.exe“命令,生成“.exe文件名_extracted” (2)用…

深度学习技巧应用8-各种数据类型的加载与处理,并输入神经网络进行训练

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用8-各种数据类型的加载与处理,并输入神经网络进行训练。在模型训练中,大家往往对各种的数据类型比较难下手,对于非结构化数据已经复杂的数据的要进行特殊处理&…

LeetCode:6390. 滑动子数组的美丽值

🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 一、🌱6390. 滑动子数组的美丽值 题目描述:给你一个长度为 n 的整…

波形生成:均匀和非均匀时间向量

波形生成—— 脉冲、chirp、VCO、正弦函数、周期性/非周期性和调制信号 使用 chirp 生成线性、二次和对数 chirp。使用 square、rectpuls 和 sawtooth 创建方波、矩形波和三角形波。 如需了解此处未显示的其他无线波形生成功能,请参阅无线波形发生器 (Communicat…

完整的生产车间管理流程是怎样的?六大步骤分享

阅读本文您将了解:1.生产车间管理的特征;2.生产车间管理流程具体步骤;3.生产车间管理流程规范的重要性。 一、生产车间管理的特征 车间管理是指对车间所从事的各项生产经营活动进行计划、组织、指挥、协调和控制的一系列管理工作。生产车间…

巧用千寻位置GNSS软件| 电力线勘测如何实现?

正如大家所知,电力线勘测是在做电力线路设计之前对设计线路沿途自然环境进行勘察测量,最后把手簿测量数据在电脑端经过转换输出为电力软件专用格式数据的专用功能。 那么在千寻位置GNSS软件中该如何操作完成电力线的勘察测量呢? 点击【测量】…

SwiftUI 中 TabView 如何原生使用类 UIPageView 的翻页样式?

功能需求 我们知道 TabView 是 SwiftUI 中非常好用的布局组织容器,它可以分类组织视图并依次展示给用户。 从 SwiftUI 2.0 开始(iOS 14.0+),TabView 除了常规的以标签(Tab Label)样式显示外,还可以用类似 UIPageView 的样式分页原生显示视图,显得更加简洁: 如上图所…

AWT-对话框——Dialog以及其子类FileDialog

Dialog: Dialog时Window类的子类,时一个容器类,属于特殊组件。对话框是可以独立存在的顶级窗口,因此用法与普通窗口的用法几乎完全一样,但是使用对话框需要注意以下几点: 对话框通常依赖于其它窗口,就是通…

基于Java+SpringBoot+vue学生学习平台详细设计实现

基于JavaSpringBootvue学生学习平台详细设计实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目…

AI Stable Diffusion Prompt参数【二】之 生成效果查验

AI Stable Diffusion Prompt参数【二】之 生成效果查验 效果国漫风生成参数配置prompt:Negative prompt:Model:Steps:Sampler:CFG scale:Clip skip:Model hash:Hires upscale:Hires upscaler:Denoising strength: 全部效果 效果 国漫风生成参数配置 prompt&#xf…

拉格朗日粒子扩散模式FLEXPART

为了高效、精准地治理区域大气污染,需要弄清污染物的来源。拉格朗日粒子扩散模式FLEXPART通过计算点、线、面或体积源释放的大量粒子的轨迹,来描述示踪物在大气中长距离、中尺度的传输、扩散、干湿沉降和辐射衰减等过程。该模式既可以通过时间的前向运算…

汇编与内联 x86-64

机器字长 x86是32位系统 64是64位系统 这里的32和64,指的都是机器字长 机器字长是 能直接进行整数/位运算的大小指针的大小(索引内存的范围) 容易与机器字长混淆的概念:字 字 字存储字长 字是MDR寄存器的位数,代表每个主存存储体中的存储…

[HDU - 4578]Transformation(线段树+多重懒标记)

[HDU - 4578]Transformation(线段树多重懒标记) 一、问题二、分析1、节点定义2、pushup3、pushdown(1)每种标记如何下传?赋值乘法加法 (2)三种标记下传的优先级问题 三、代码 一、问题 二、分析…

C++数据结构:手撕AVL树

目录 一. 什么是AVL树 二. AVL树的节点定义 三. AVL树的插入操作 3.1 寻找插入位置 3.2 更新平衡因子 3.3 AVL树的旋转调整 3.4 AVL树插入操作的整体实现 四. AVL树的检验 附录:AVL树的实现完整代码 AVL树定义代码 -- AVLTree.h AVL树检验代码 -- test.…

MFC加载动态gif图片文件C++语言,基于MFC的动画播放控件

MFC加载动态gif图片,使用VS2015环境 一、将下载的PictureEx.h和PictureEx.cpp放在工程文件的目录下,动态gif图片放在工程文件的res文件夹下;(GIF动图下载 https://icons8.com/preloaders/en/search/move) &#xff08…

软考软件设计师 操作系统笔记

操作系统地位 程序顺序执行(进程管理) 程序顺序执行的特征,顺序性封闭性可再现性 前趋图 P1结束后 V操作 SS1 P2操作前先执行S S -1 此时S0 一个箭头对应一个信号量 程序并发执行和前驱图 找到输入i计算c输出p,如果找不到就…