打捞回帖、回信来发博客是个偷懒的好办法
ZZZzzz....ZZZzzz....
------------------------------------------------------------
xuhang1128 写道
1.比如上面线程1执行to方法,我觉得就是先将3赋值给a,然后a写到主内存,
上面 assign操作所说的, transfers a value from the thread's execution engine into the thread's working copy of a variable
这句话里面的 thread's execution engine和 thread's working copy of a variable分别代表什么啊,我的理解就是将3赋值给a,然后又是用store命令将 thread's working copy of a variable搞到 main memory,这时候还不完了吗,为什么后面又是 write?
2.还有上面的线程2执行的fro方法的read所说的master copy of a variable to a thread's working memory ,这里的
master copy of a variable 又是指什么呢?规范里面好像说 thread's working memory可以使寄存器,高速缓存之类的东西,之后又用load操作将main memory 将value值搞到 thread's working copy of a variable,这里的 thread's working copy of a variable是局部变量吗还是什么
讨论前,先来看看这几个操作的含义(书上有我就不重新打一遍了,但与出版社有版权协议,不太方便粘贴复制,就给你贴图片了):
主内存和工作内存是什么,在这段前面的2节里面有更详细的介绍,内容太多我就不全部粘贴了,反正还有2周书就应该能出来。我做个类比可能好理解一些,简单来说你可以把它们的关系理解成PC机里面的“内存”和“处理器Cache”之间的关系,所有数据在内存中都用,但是要用的时候Cache中都有一份拷贝,如果是多CPU或者多核处理器,同一份数据还可能在不同的Cache中还有拷贝,解决内存与Cache的一致性问题,硬件里有各种一致性协议。而JVM的内存模型其中一个任务也是解决main memory和working memory之间的一致性问题。
“thread's working copy of a variable”不是局部变量,它就是工作内存中的变量拷贝副本而已,事实上在JMM中一开始就从定义了“variable”的含义,它包括了实例字段、静态字段和构成数组对象的元素,但是不包括局部变量与方法参数,因为后者是线程私有的 ,不会被共享,自然就不存在竞争问题。
关于为何store之后又要write的问题,从上面图片你可以看到,这2个操作是作用在不同区域上的,你把main memory和work memory看作2间房子,这2个操作就好比开门,要把物品A从房间以拿到(复制到)房间B,自然要分别进行“拿出来”和“放进去”2个操作。为什么不定义一个诸如transfer之内的操作一次过完成呢?那是因为这6个操作都是“原子的”,不可拆分,如果定义一个原子的“transfer”操作当然也可以完成任务,但原子操作的范围更大,也就意味这个操作的锁定时间更长。这与JMM规范的基本思想:既准确又宽松(见下面图片)相违背了。
xuhang1128 写道
JVM栈,操作数栈,本地栈只是抽象的概念,HotSpot VM使用的Java栈就直接融合了概念上的JVM栈与本地栈,而在被编译过的方法的栈帧里不存在操作数栈——消失了 。不要把抽象概念与具体实现混为一谈。
这是别人说的,请问上面说的编译过的方法操作数栈消失了是什么意思啊
首先,需要弄清楚概念,你这里发生混淆了。HotSpot里面的“本地方法栈”(Native Method Stacks)和“Java虚拟机栈”(Java Virtual Machine Stacks)合二为一了。这意味着Java方法调用和本地方法(譬如JNI方法调用)使用的是同一个栈,从使用上理解,就是-Xoss参数和-Xss参数变成了同一个,因此在HotSpot里面-Xoss无效。而“操作数栈”(Operand Stack)是栈帧(Stack Frame)的一部分,栈帧说白了就是Java虚拟机栈的栈元素。它是客观存在的,不会消失。由于JVM规范的指引或者说是限制,各种Java虚拟机都是基于栈结构的,这里的栈就是操作数栈,它是指令执行的基本前提。所以在各种虚拟机中,甚至在一个虚拟机的解析和编译执行引擎中它可以有不同的存在形式,但是总谈不上“消失”的(
这里有陷阱,请看撒迦的回帖)。当然,不基于栈的虚拟机,譬如Google Android的Dalvik虚拟机(基于寄存器架构)就可以没有操作数栈,当然,那也已经不是严格意义上的“JVM”了。
xuhang1128 写道
字节码指令不还有对操作数栈的操作码,不懂了哎
“操作数栈的操作码”这个提法不妥当的。字节码指令,或者说操作码(Opcodes)不放在操作数栈上,操作数栈既然都命名为“操作数(Operand)”,那肯定是只放运算参数、中间过程结果和运算结果的啊,放个Opcodes上去有什么意思呢?
分享到:
相关推荐
深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发...
Java运行时内存模型图
Java内存模型详解JMM.docx
深入Java内存模型-JMM。。。。。。。。。。。。。。。。。。
读深入理解JAVA内存模型整理的思维导图 本人记忆差,整理这个思维导图,相当于较认真的看了一遍,整个思维导图,基本上就是对原文的拷贝。 有了层级关系。和本人自己的一些理解。由于思维导图弄出来的图片大于100M了...
java内存模型jmm
从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。...
有关JVM内存模型的概述,用于对JVM的整体把握从而针对性的学习
深入理解 Java 内存模型,由程晓明编著,深入理解java内存模型JMM
本书目录 基础 并发编程模型的分类 Java内存模型的抽象 重排序 ...JMM,处理器内存模型与顺序一致性内存模型之间的关系 JMM的设计 JMM的内存可见性保证 JSR-133对旧内存模型的修补 个人简介 参考文献
JMM内存模型的一次记录
JMM内存模型图解说秒懂
JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(Main Memory)中, 每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程读/写共享变量的副本 本地内存时JMM的一个抽象...
基础 4 并发编程模型的分类 4 Java 内存模型的抽象 4 ... JMM,处理器内存模型与顺序一致性内存模型之间的关系 68 JMM 的设计 69 JMM 的内存可见性保证 72 JSR-133 对旧内存模型的修补 73 个人简介 74 参考文献 74
并发编程有多种风格,除了CSP(通信顺序进程)、Actor等模型外,大家熟悉的应该是基于线程和锁的共享内存模型了。在多线程编程中,需要注意三类并发问题: 1、原子性 2、可见性 3、重排序 原子性涉及到...
14、深入理解井发可见性、有序性、原子性与JMM内存模型 (1).pdf 15、CPU缓存架构详解&高性能内存队列Disruptor 实战 (1).pdf 16、常用并发设计模式精讲 (1).pdf designpattern.zip disruptor.zip forkjoin.zip jmm(1...
介绍java的内存管理方式和特点 1.JMM 简介 2.堆和栈 3.本机内存 4.防止内存泄漏
Java内存模型及Volatile底层实现原理
Agenda: •什么是Java内存模型JMM •内存可见性 •有序性 •指令重排序 •内存屏障 •顺序一致性与Happens-before规则 •volatile, synchronized, 原子变量,锁, final的原理
由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题:由于 CPU 执行速度很快,而从内存读取数据和向内存写入数据的过程跟 CPU 执行指令的速度比起来要差几个数量级,因此如果任何时候...