关于 JMM 中 read->load 操作的疑问

2019-10-14 00:21:54 +08:00
 vikeria
在 JMM 中,主内存和工作内存之间的交互,定义了 8 种原子操作:lock、unlock、read、load、use、assign、store。

其中
read(读取):作用于主内存,它把变量值从主内存传送到线程的工作内存中,以便随后的 load 动作使用;
load(载入):作用于工作内存,它把 read 操作的值放入工作内存中的变量副本中;
use(使用):作用于工作内存,它把工作内存中的值传递给执行引擎,每当虚拟机遇到一个需要使用这个变量的指令时候,将会执行这个动作;

主内存实际对应 JVM 运行时数据区 中的堆,这里假设是一个 new 出来的对象
工作内存实际对应 某一个线程中的 运行时栈帧结构中的部分(局部变量表、操作栈等等)

其中 use,可以理解是将 变量传递到 操作栈,

那么
read:把变量值从主内存传送到线程的工作内存
是从堆中传递到栈帧结构中的哪里呢?或者不是栈帧结构,又是其他什么结构呢?

load:作用于工作内存,它把 read 操作的值放入工作内存中的变量副本中;
是指从那边放到哪边了呢?

一直对这边的 JMM 操作抽象与实际执行的内容有点理不清爽,有那位同学帮忙解答一下,多谢。
4078 次点击
所在节点    Java
7 条回复
sagaxu
2019-10-14 01:50:27 +08:00
read 是从内存读取到当前线程 CPU 的 cache
vikeria
2019-10-14 14:01:22 +08:00
@sagaxu 那就相当于是这个是 jvm 针对不同的操作系统 /硬件的实现了?没有那种存在于 JVM 逻辑结构中的可以描述的方式?
sagaxu
2019-10-14 14:42:36 +08:00
@vikeria jvm 定义的抽象 vm,不对应任何处理器架构。jmm 的原子操作,不能定义的太细,太细了在某些平台无法实现,太粗了在某些平台要大量加锁严重降低性能。
anofac
2019-10-14 14:50:30 +08:00
mark,下面是我个人猜想的,还没找到权威的资料,仅做讨论哈,期待此帖出现一个大神~

read 是从堆读出数据(一份拷贝),但还没写入线程工作内存(对应硬件上,应该在某级缓存中?)
load 是将这份数据的拷贝写入了局部变量表中
use 是将这份数据在需要执行的时候从局部变量表又传递到操作数栈中
vikeria
2019-10-14 15:20:15 +08:00
@anofac 嗯,想法差不多
Aresxue
2019-10-14 15:23:15 +08:00
应该取决于 jvm 实现,Dalvik VM 都不是基于栈的指令集,栈帧和物理机构的对应也不是统一的。
vikeria
2019-10-14 15:49:33 +08:00
@Aresxue 嗯,是的。DVM 是基于寄存器的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/608972

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX