加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

硬件内存模型到 Java 内存模型,这些硬核知识你知多少?

发布时间:2019-11-10 13:58:20 所属栏目:建站 来源:平头哥
导读:Java 内存模子跟上一篇 JVM 内存布局很像,我常常会把他们搞混,但着实它们不是一回事,并且相差还很大的,但愿你没它们搞混,出格是在口试的时辰,搞混了的话就会答非所问,影响你的口试后果,虽然大概你遇到了半吊子口试官,那就要恭喜你了。Java 内存模
副问题[/!--empirenews.page--]

Java 内存模子跟上一篇 JVM 内存布局很像,我常常会把他们搞混,但着实它们不是一回事,并且相差还很大的,但愿你没它们搞混,出格是在口试的时辰,搞混了的话就会答非所问,影响你的口试后果,虽然大概你遇到了半吊子口试官,那就要恭喜你了。Java 内存模子比 JVM 内存布局伟大许多,Java 内存模子有一个类型叫:《JSR 133 :Java 内存模子与线程类型》,内里的内容很富厚,假如你没看过的话,我提议你看一下。本日我们就简朴的来聊一聊 Java 内存模子,关于 Java 内存模子,我们照旧先从硬件内存模子入手。

硬件内存模子到 Java 内存模子,这些硬核常识你知几多?

硬件内存模子

先来看看硬件内存简朴架构,如下图所示:

硬件内存模子到 Java 内存模子,这些硬核常识你知几多?

硬件内存布局

这是一幅简朴的硬件内存布局图,真实的布局图要比这伟大许多,出格是在缓存层,此刻的计较机中 CPU 缓存一样平常有三层,你也可以打开你的电脑看看,打开 使命资源打点器 ---> 机能 ---> cpu ,如下图所示:

硬件内存模子到 Java 内存模子,这些硬核常识你知几多? 

CPU 缓存

从图中可以看出我这台呆板的 CPU 有三级缓存,一级缓存 (L1) 、二级缓存(L2)、三级缓存(L3),一级缓存是最靠近 CPU 的,三级缓存是最靠近内存的,每一级缓存的数据都是下一级缓存的一部门。三级缓存架构如下图所示:

硬件内存模子到 Java 内存模子,这些硬核常识你知几多? 

图片来历收集

此刻我们对硬件内存架构有了必然的相识,我们来弄大白一个题目,为什么必要在 CPU 和内存之间添加缓存?

关于这个题目我们就简朴点说,我们知道 CPU 是高速的,而内存相对来说是低速的,这就会造成一个题目,不能充实的操作 CPU 高速的特点,由于 CPU 每次从内存里获取数据的话都必要守候,这样就挥霍了 CPU 高速的机能,缓存的呈现就是用来消除 CPU 与内存之间差距的。缓存的速率要大于内存小于 CPU ,插手缓存之后,CPU 直接从缓存中读取数据,由于缓存照旧较量快的,以是这样就充实操作了 CPU 高速的特征。但也不是每次都能从缓存中读取到数据,这个跟我们项目中行使的 redis 等缓存器材一样,也存在一个缓存掷中率,在 CPU 中,先查找 L1 Cache,假如 L1 Cache 没有掷中,就往 L2 Cache 里继承找,依此类推,最后没找到的话直接从内存中取,然后添加到缓存中。虽然当 CPU 必要写数据到主存时,同样会先革新寄存器中的数据到 CPU 缓存,然后再把数据革新到主内存中。

大概你已经看出了这个框架的破绽,在单核期间只有一个处理赏罚器焦点,读/写操纵完全都是由单核完成,没什么题目;可是多核架构,一个核修改主存后,其他焦点并不知道数据已经失效,继承傻傻的行使主存可能本身缓存层的数据,那么就会导致数据纷歧致的环境。关于这个题目 CPU 硬件厂商也提供了办理步伐,叫做缓存同等性协议(MESI 协议),缓存同等性协议这对象我也不相识,我也说不清,以是就不在这里 BB 了,有乐趣的可以自行研究。

聊完了硬件内存架构,我们将核心回到我们的主题 Java 内存模子上,下面就一路来聊一聊 Java 内存模子。

Java 内存模子

Java 内存模子是什么?Java 内存模子可以领略为遵照多核硬件架构的计划,用 Java 实现了一套 JVM 层面的“缓存同等性”,这样就可以规避 CPU 硬件厂商的尺度纷歧样带来的风险。好了,正式先容一下 Java 内存模子:Java 内存模子 ( Java Memory Model,简称 JMM ),自己是种抽象的观念,并不是像硬件架构一样真实存在的,它描写的是一组法则或类型,通过这组类型界说了措施中各个变量 (包罗实例字段、静态字段和组成数组工具的元素) 的会见方法,更多关于 Java 内存模子常识可以阅读 JSR 133 :Java 内存模子与线程类型。

我们知道 JVM 运行措施的实体是线程,在上一篇 JVM 内存布局中我们得知每个线程建设时,JVM 城市为其建设一个事变内存 ( Java 栈 ),用于存储线程私稀有据,而 Java 内存模子中划定全部变量都存储在主内存,主内存是共享内存地区,全部线程都可以会见,但线程对变量的操纵 ( 读取赋值等 ) 必需在事变内存中举办,起主要将变量从主内存拷贝到本身的事变内存空间,然后对变量举办操纵,操纵完后再将变量写回主内存,不能直接操纵主内存中的变量。

我们知道 Java 栈是每个线程私有的数据地区,此外线程无法会见到差异线程的私稀有据,以是线程必要通讯的话,就必需通过主内存来完成,Java 内存模子就是夹在这两者之间的一组类型,我们先来看看这个抽象架构图:

硬件内存模子到 Java 内存模子,这些硬核常识你知几多?

图片来历收集

从布局图来看,假如线程 A 与线程 B 之间必要通讯的话,必必要经验下面 2 个步调:

  1. 起首,线程 A 把当地内存 A 中的共享变量副本中的值革新到主内存中去。
  2. 然后,线程 B 到主内存中去读取线程 A 更新之后的值,这样线程 A 中的变量值就到了线程 B 中。

我们来看一个详细的例子来加深一下领略,看下面这张图:

硬件内存模子到 Java 内存模子,这些硬核常识你知几多?

图片来历收集

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读