`
IcyFenix
  • 浏览: 363719 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
文章分类
社区版块
存档分类
最新评论

RE:关于JMM模型中工作内存、主内存和几个操作的理解

阅读更多
打捞回帖、回信来发博客是个偷懒的好办法 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上去有什么意思呢?
分享到:
评论
9 楼 IcyFenix 2011-06-07  
= =# 没有上下文,刚刚以为我自己眼花,再看了一遍原文:
引用
字节码指令不还有对操作数栈的操作码
我看后的反应是:
引用
字节码指令 有对 操作数栈的操作码
你看后的反应是:
引用
字节码指令 有对 操作数栈 操作 的操作码
8 楼 RednaxelaFX 2011-06-06  
xuhang1128 写道
字节码指令不还有对操作数栈的操作码,不懂了哎

这句的上下文是啥?
JVM的字节码指令集里确实有单独对操作数栈操作的指令,例如dup、pop等。
上下文里是不是有什么地方说把指令压到栈上?没有的话这句看起来挺正常的。
7 楼 RednaxelaFX 2011-06-06  
IcyFenix 写道
好的,你的回复我在正文中用红色字体标识出来了。

anyway,我还是认为,如果我们的计算机本身就是栈架构的,那就没有哪款编译器会做削除操作栈这种事情。当然,这个“如果”是个海市蜃楼、空中楼阁。

呵呵,“如果”。

这事情很简单。一个基于寄存器的虚拟架构在一个基于寄存器的实际硬件上仍然很可能会把那些虚拟寄存器分配到硬件的内存里而不是硬件的寄存器里。例子多的是。

如果有人非要在基于栈的硬件上把削除了操作数栈的方式实现出来(把原本的操作数栈转换为虚拟寄存器然后分配到内存里),那完全可行。虽然很难想像为什么要这样做。
但在基于寄存器的机器上,这操作数栈的语义想怎么实现就有许多很现实的可能性。完全按照原样实现也行,部分削除也行,完全削除也行。

其实很多东西只要自己写过就很容易理解…
6 楼 IcyFenix 2011-06-06  
好的,你的回复我在正文中用红色字体标识出来了。

anyway,我还是认为,如果我们的计算机本身就是栈架构的,那就没有哪款编译器会做削除操作栈这种事情。当然,这个“如果”是个海市蜃楼、空中楼阁。
5 楼 RednaxelaFX 2011-06-06  
IcyFenix 写道
RednaxelaFX 写道
IcyFenix 写道
所以在各种虚拟机中,甚至在一个虚拟机的解析和编译执行引擎中它可以有不同的存在形式,但是总谈不上“消失”的。

就是消失了。需要解释不?


,字节码JIT后就是机器码了,而现在物理机的指令集基本上都是寄存器架构,所以JIT编译过程中总要进行转换:把抽象模型中通过Operand Stack进行的数据交换行为使用各种寄存器分配算法转化成直接使用寄存器来完成,这点算是Operand Stack“消失了”还是“不同的存在形式”呢?撒迦说的是这点么?

“操作数栈”的存在与否跟机器的体系结构是register-based还是stack-based没关系。

操作数栈仍然存在的例子:
·HotSpot VM的解释器(操作数栈顶一个值在寄存器里,其余在Java栈中)
·IBM J9的解释器(整个操作数栈都真实存在于Java栈中)
·Apache Harmony的DRLVM的Jitrino.JET编译器生成的代码(只对操作数栈顶少量值分配寄存器,其余在Java栈中)

操作数栈已经不存在的例子:
·HotSpot VM的C1与C2编译器生成的代码(在编译的最初阶段就模拟并削除了操作数栈)
·Apache Harmony的DRLVM的Jitrino.OPT编译器生成的代码(同上)
4 楼 IcyFenix 2011-06-06  
RednaxelaFX 写道
IcyFenix 写道
所以在各种虚拟机中,甚至在一个虚拟机的解析和编译执行引擎中它可以有不同的存在形式,但是总谈不上“消失”的。

就是消失了。需要解释不?


,字节码JIT后就是机器码了,而现在物理机的指令集基本上都是寄存器架构,所以JIT编译过程中总要进行转换:把抽象模型中通过Operand Stack进行的数据交换行为使用各种寄存器分配算法转化成直接使用寄存器来完成,这点算是Operand Stack“消失了”还是“不同的存在形式”呢?撒迦说的是这点么?
3 楼 RednaxelaFX 2011-06-06  
IcyFenix 写道
所以在各种虚拟机中,甚至在一个虚拟机的解析和编译执行引擎中它可以有不同的存在形式,但是总谈不上“消失”的。

就是消失了。需要解释不?
2 楼 IcyFenix 2011-06-06  
RednaxelaFX 写道
嗯这位同学拿我的站内信回复去问你了么。


哈哈哈,我一看到站内信中“不要把抽象概念与具体实现混为一谈”这句,脑子里就冒出一个念头,这话8成是撒迦说的。
1 楼 RednaxelaFX 2011-06-06  
嗯这位同学拿我的站内信回复去问你了么。

相关推荐

    三问JMM--有关JVM内存模型的PPT

    JMM借鉴了CPU-缓存-主内存的模型,即线程对共享变量的访问并不是直接访问主内存,而是通过访问共享内存的一个副本,这个副本称为工作内存。工作内存可以是寄存器、CPU缓存或主内存的一部分,具体取决于虚拟机的实现...

    Java内存模型详解JMM.docx

    JMM的重要性在于它提供了一个跨平台的内存模型,使得Java开发者可以更好地理解Java语言的语言特性和内存相关的内容。JMM的概念包括堆、栈、本机内存、防止内存泄漏等方面。 本文将从JMM的简介、堆和栈、本机内存、...

    14、深入理解并发可见性、有序性、原子性与JMM内存模型

    深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发...

    深入Java内存模型-JMM

    Java内存模型,简称JMM(Java Memory Model),是Java虚拟机规范中定义的一个抽象概念,它描述了在多线程环境下,如何保证各个线程对共享数据的一致性视图。JMM的主要目标是定义程序中各个变量的访问规则,以及在...

    深入理解java内存模型

    这本书"深入理解Java内存模型"显然是为了帮助读者深入探讨这个主题,以便更好地理解和解决并发编程中的问题。 Java内存模型主要涉及以下几个核心概念: 1. **主内存**:所有线程共享的数据存储区域,包括类的静态...

    java内存模型(JMM).docx

    JMM定义了8种基本操作,以确保主内存和工作内存之间的交互具有原子性: 1. `lock`:锁定主内存变量,使变量只能由当前线程访问。 2. `unlock`:解锁主内存变量,允许其他线程锁定。 3. `read`:从主内存读取变量值到...

    JMM内存模型图

    Java运行时内存模型图

    深入理解Java内存模型 pdf 超清版

    - **工作内存**: 每个线程的私有缓存,用于存储从主内存中复制的变量副本,执行计算操作后可能更新回主内存。 2. **内存间交互** - **读写操作**: 线程从主内存读取变量到工作内存,然后在工作内存中进行计算,...

    深入理解 Java 内存模型

    Java 内存模型(Java Memory Model,简称 JMM)是 Java 平台中关于线程如何访问共享变量的一套规则,它定义了线程之间的内存可见性、数据一致性以及指令重排序等关键概念,对于多线程编程和并发性能优化至关重要。...

    java内存模型JMM(Java Memory Model)1

    1. **内存分层**:在JMM中,内存分为两部分:主内存(Main Memory)和工作内存(Working Memory)。主内存是所有线程共享的存储区域,包含所有实例字段、静态字段和数组元素。工作内存则是每个线程私有的,类似于栈...

    3 JMM内存模型.md,学习代码

    Java内存模型(JMM,Java Memory Model)是Java平台中用于定义线程间共享变量的访问规则的一个抽象概念,它规定了线程如何与主内存交互,以及对共享变量的操作顺序。在Java并发编程中,理解JMM至关重要,因为它直接...

    jmm模型ppt基本概念介绍

    2. 主要过程是将变量从主内存拷贝的每个线程各自的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存。 3. 如果存在两个线程同时对一个主内存中的实例对象的变量进行操作就有可能诱发线程安全问题。 ...

    java内存模型的介绍和说明

    Java Memory Model(JMM),即Java内存模型,是Java虚拟机规范中定义的一套规定,用于描述Java程序中的各种变量(包括实例字段、静态字段和数组元素)的访问规则,以及在并发环境下如何保证这些变量的正确性和一致性...

    深入理解Java内存模型

    Java内存模型是并发编程中一个至关重要的概念,它定义了共享变量的访问规则,以及这些变量如何在多线程环境下进行读写操作。在深入理解Java内存模型之前,我们需要先了解并发编程模型的分类,然后掌握Java内存模型的...

    深入理解Java内存模型(二)共3页.pdf.zip

    Java内存模型,简称JMM(Java Memory Model),是Java虚拟机规范中定义的一个抽象概念,它描述了在多线程环境下,如何在共享内存中读写变量,以及这些读写操作的可见性、原子性和有序性。这个模型规定了线程与主内存...

    Java内存模型(JMM)深度解析:原理、特性与代码实践

    JMM是Java并发编程的基石,它通过定义主内存和工作内存之间的交互规则,以及原子性、可见性和有序性三个特性,为编写正确的并发程序提供了保障。理解JMM的原理和特性,以及如何在代码中应用这些特性,对于Java开发者...

    01-并发编程之深入理解JMM&并发三大特性(一).pdf

    在深入理解Java内存模型(JMM)及并发三大特性方面,我们需要先建立对多线程、共享内存模型、可见性、有序性和原子性的基础概念。Java内存模型是Java并发编程的核心,它定义了共享变量在多线程环境中的行为规则和...

    深入理解 Java 内存模型_程晓明_InfoQ_java_内存模型_

    Java内存模型,简称JMM(Java Memory Model),是Java编程语言规范的一部分,它定义了线程如何共享和访问内存,以及在多线程环境中如何保证数据一致性。理解JMM对于编写高效、正确且线程安全的Java代码至关重要。 ...

    14、深入理解并发可见性、有序性、原子性与JMM内存模型(1).pdf

    根据提供的文档信息,本文将详细解析并发编程中的关键概念——原子性、可见性及有序性,并结合Java内存模型(JMM)来深入理解这些概念。同时,我们也会通过具体示例来探讨这些问题在实际编程中的应用。 ### 一、并发...

Global site tag (gtag.js) - Google Analytics