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

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

  •  
  •   vikeria · 2019-10-14 00:21:54 +08:00 · 4052 次点击
    这是一个创建于 1870 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在 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
    sagaxu
        1
    sagaxu  
       2019-10-14 01:50:27 +08:00 via Android   ❤️ 1
    read 是从内存读取到当前线程 CPU 的 cache
    vikeria
        2
    vikeria  
    OP
       2019-10-14 14:01:22 +08:00
    @sagaxu 那就相当于是这个是 jvm 针对不同的操作系统 /硬件的实现了?没有那种存在于 JVM 逻辑结构中的可以描述的方式?
    sagaxu
        3
    sagaxu  
       2019-10-14 14:42:36 +08:00 via Android
    @vikeria jvm 定义的抽象 vm,不对应任何处理器架构。jmm 的原子操作,不能定义的太细,太细了在某些平台无法实现,太粗了在某些平台要大量加锁严重降低性能。
    anofac
        4
    anofac  
       2019-10-14 14:50:30 +08:00   ❤️ 1
    mark,下面是我个人猜想的,还没找到权威的资料,仅做讨论哈,期待此帖出现一个大神~

    read 是从堆读出数据(一份拷贝),但还没写入线程工作内存(对应硬件上,应该在某级缓存中?)
    load 是将这份数据的拷贝写入了局部变量表中
    use 是将这份数据在需要执行的时候从局部变量表又传递到操作数栈中
    vikeria
        5
    vikeria  
    OP
       2019-10-14 15:20:15 +08:00
    @anofac 嗯,想法差不多
    Aresxue
        6
    Aresxue  
       2019-10-14 15:23:15 +08:00   ❤️ 1
    应该取决于 jvm 实现,Dalvik VM 都不是基于栈的指令集,栈帧和物理机构的对应也不是统一的。
    vikeria
        7
    vikeria  
    OP
       2019-10-14 15:49:33 +08:00
    @Aresxue 嗯,是的。DVM 是基于寄存器的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5635 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 03:15 · PVG 11:15 · LAX 19:15 · JFK 22:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.