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

简介: 该文介绍了Java多线程中`volatile`关键字确保内存可见性的概念。

在学习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)。这样一来,在游戏场景下电脑性能的提升就很大了。





相关文章
|
3月前
|
Java 编译器 开发者
深入理解Java内存模型(JMM)及其对并发编程的影响
【9月更文挑战第37天】在Java的世界里,内存模型是隐藏在代码背后的守护者,它默默地协调着多线程环境下的数据一致性和可见性问题。本文将揭开Java内存模型的神秘面纱,带领读者探索其对并发编程实践的深远影响。通过深入浅出的方式,我们将了解内存模型的基本概念、工作原理以及如何在实际开发中正确应用这些知识,确保程序的正确性和高效性。
|
2月前
|
存储 Java 编译器
Java内存模型(JMM)深度解析####
本文深入探讨了Java内存模型(JMM)的工作原理,旨在帮助开发者理解多线程环境下并发编程的挑战与解决方案。通过剖析JVM如何管理线程间的数据可见性、原子性和有序性问题,本文将揭示synchronized关键字背后的机制,并介绍volatile关键字和final关键字在保证变量同步与不可变性方面的作用。同时,文章还将讨论现代Java并发工具类如java.util.concurrent包中的核心组件,以及它们如何简化高效并发程序的设计。无论你是初学者还是有经验的开发者,本文都将为你提供宝贵的见解,助你在Java并发编程领域更进一步。 ####
|
5月前
|
存储 SQL 缓存
揭秘Java并发核心:深度剖析Java内存模型(JMM)与Volatile关键字的魔法底层,让你的多线程应用无懈可击
【8月更文挑战第4天】Java内存模型(JMM)是Java并发的核心,定义了多线程环境中变量的访问规则,确保原子性、可见性和有序性。JMM区分了主内存与工作内存,以提高性能但可能引入可见性问题。Volatile关键字确保变量的可见性和有序性,其作用于读写操作中插入内存屏障,避免缓存一致性问题。例如,在DCL单例模式中使用Volatile确保实例化过程的可见性。Volatile依赖内存屏障和缓存一致性协议,但不保证原子性,需与其他同步机制配合使用以构建安全的并发程序。
77 0
|
2月前
|
存储 缓存 安全
Java内存模型(JMM):深入理解并发编程的基石####
【10月更文挑战第29天】 本文作为一篇技术性文章,旨在深入探讨Java内存模型(JMM)的核心概念、工作原理及其在并发编程中的应用。我们将从JMM的基本定义出发,逐步剖析其如何通过happens-before原则、volatile关键字、synchronized关键字等机制,解决多线程环境下的数据可见性、原子性和有序性问题。不同于常规摘要的简述方式,本摘要将直接概述文章的核心内容,为读者提供一个清晰的学习路径。 ####
51 2
|
4月前
|
监控 算法 Java
深入理解Java中的垃圾回收机制在Java编程中,垃圾回收(Garbage Collection, GC)是一个核心概念,它自动管理内存,帮助开发者避免内存泄漏和溢出问题。本文将探讨Java中的垃圾回收机制,包括其基本原理、不同类型的垃圾收集器以及如何调优垃圾回收性能。通过深入浅出的方式,让读者对Java的垃圾回收有一个全面的认识。
本文详细介绍了Java中的垃圾回收机制,从基本原理到不同类型垃圾收集器的工作原理,再到实际调优策略。通过通俗易懂的语言和条理清晰的解释,帮助读者更好地理解和应用Java的垃圾回收技术,从而编写出更高效、稳定的Java应用程序。
|
5月前
|
存储 缓存 Java
Java内存模型(JMM)
Java内存模型(JMM)是一个抽象概念,用于规范程序中各种变量(实例字段、静态字段及数组元素)的访问方式,确保不同Java虚拟机(JVM)上的并发程序结果一致可靠。JMM定义了主存储器(所有线程共享)与工作存储器(线程私有)的概念,线程间通过主存储器进行通信。JMM具备三大特性:原子性(确保基本读写操作的不可分割)、可见性(确保一个线程对共享变量的修改对其他线程可见)、有序性(防止指令被处理器或编译器重排序影响程序逻辑)。通过这些特性,JMM解决了多线程环境下的数据一致性问题。
|
5月前
|
存储 程序员 C++
内存管理概念 (二)
内存管理概念 (二)
85 1
|
5月前
|
安全 Java 程序员
深入浅出Java内存模型:探索JMM的奥秘
在Java编程世界中,理解其内存模型(JMM)是提升代码性能和确保线程安全的关键。本文将带你走进Java内存模型的大门,通过浅显易懂的方式揭示其工作原理,并指导你如何在实际开发中有效利用JMM来避免常见的并发问题。
|
6月前
|
存储 安全 Java
Java面试题:请解释Java内存模型(JMM)是什么,它如何保证线程安全?
Java面试题:请解释Java内存模型(JMM)是什么,它如何保证线程安全?
124 13
|
5月前
|
存储 算法 程序员
内存管理概念(一)
内存管理概念(一)
100 0