首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
宝塔
V2EX  ›  Java

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

  •  
  •   vikeria · 39 天前 · 782 次点击
    这是一个创建于 39 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在 JMM 中,主内存和工作内存之间的交互,定义了 8 种原子操作:lock、unlock、read、load、use、assign、store。

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

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

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

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

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

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

    read 是从堆读出数据(一份拷贝),但还没写入线程工作内存(对应硬件上,应该在某级缓存中?)
    load 是将这份数据的拷贝写入了局部变量表中
    use 是将这份数据在需要执行的时候从局部变量表又传递到操作数栈中
        5
    vikeria   39 天前
    @anofac 嗯,想法差不多
        6
    Aresxue   39 天前   ♥ 1
    应该取决于 jvm 实现,Dalvik VM 都不是基于栈的指令集,栈帧和物理机构的对应也不是统一的。
        7
    vikeria   39 天前
    @Aresxue 嗯,是的。DVM 是基于寄存器的
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3875 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 09:44 · PVG 17:44 · LAX 01:44 · JFK 04:44
    ♥ Do have faith in what you're doing.