天天看點

Java并發程式設計 - Java記憶體模型(JMM)

Java記憶體模型與硬體記憶體架構的關系

通過對前面的硬體記憶體架構、Java記憶體模型以及Java多線程的實作原理的了解,我們應該已經意識到,多線程的執行最終都會映射到硬體處理器上進行執行,但Java記憶體模型和硬體記憶體架構并不完全一緻。對于硬體記憶體來說隻有寄存器、緩存記憶體、主記憶體的概念,并沒有工作記憶體(線程私有資料區域)和主記憶體(堆記憶體)之分,也就是說Java記憶體模型對記憶體的劃分對硬體記憶體并沒有任何影響,因為JMM隻是一種抽象的概念,是一組規則,并不實際存在,不管是工作記憶體的資料還是主記憶體的資料,對于計算機硬體來說都會存儲在計算機主記憶體中,當然也有可能存儲到CPU緩存或者寄存器中,是以總體上來說,Java記憶體模型和計算機硬體記憶體架構是一個互相交叉的關系,是一種抽象概念劃分與真實實體硬體的交叉。(注意對于Java記憶體區域劃分也是同樣的道理)。

Java并發程式設計 - Java記憶體模型(JMM)
Java并發程式設計 - Java記憶體模型(JMM)
Java并發程式設計 - Java記憶體模型(JMM)
  • 整個是個JVM,但是“線程-工作記憶體-主記憶體”屬于JMM。
  • JVM将記憶體組織為主記憶體和工作記憶體兩個部分。
  • 主記憶體主要包括本地方法區和堆。每個線程都有一個工作記憶體,工作記憶體中主要包括兩個部分,一個是屬于該線程私有的棧和對主存部分變量拷貝的寄存器(包括程式計數器PC和CPU工作的高速緩存區)。

    1、所有的變量都存儲在主記憶體中(虛拟機記憶體的一部分),對于所有線程都是共享的。

    2、每條線程都有自己的工作記憶體,工作記憶體中儲存的是主存中某些變量的拷貝,線程對變量的所有操作都必須在工作記憶體中進行,而不能直接讀寫主記憶體中的變量。

    3、線程之間無法直接通路對方的工作記憶體中的變量,線程間變量的傳遞均需要通過主記憶體來完成。

JMM是一個規範,規範Java虛拟機與計算機記憶體是如何協同工作的,規定一個線程如何和何時能夠看到其他線程修改過的共享變量的值以及在必須時如何同步地通路共享變量。 為了屏蔽硬體和作業系統的内層的通路差異,以實作讓JAVA程式在各種平台上一緻的并發效果,Java虛拟機規範中定義了“Java記憶體模型”。

Heap(堆):運作時的資料區,是由垃圾回收負責;

  • 優勢:可以動态配置設定記憶體大小,生存期也不必事先告訴編譯器,運作時動态配置設定記憶體,垃圾回收器會在不需要使用這些記憶體時,回收掉;
  • 缺點:因為時運作時動态配置設定記憶體,是以存儲速度相對慢一些。

Stack(棧):棧記憶體儲基本類型變量,列入:小寫的int,char......

  • 優勢:存儲速度比堆快,僅次于計算機的寄存器,棧的記憶體是可以共享的;
  • 缺點:存在棧内的資料大小與生存期必須是确定的,缺乏靈活性。
Java并發程式設計 - Java記憶體模型(JMM)
Java并發程式設計 - Java記憶體模型(JMM)
  • 每一個CPU都有一系列的寄存器 CPU在寄存器上執行的速度,遠大于在主存上執行的速度。由于計算機的儲存設備與處理器的預算速度之間,有幾個數量級的差距,是以計算機系統不得不加入一層讀寫速度接近處理器運算速度的進階緩存,作為記憶體與處理器之間的緩沖,将運算需要的資料複制到緩存中,當運算結束後,再從緩存同步到記憶體中。
  • JAVA記憶體模型要求:調用棧和本地模型存放在棧,對象存放在堆上 對一個對象的引用(包含這個對象的變量、方法)是在棧上,這個對象本身是在堆上,一個對象的成員變量可能會随着對象自身存在堆上,不管這個變量是原始類型,還是引用類型,靜态成員變量跟随類的定義一起存放在堆上;放在堆上的對象可以被所持有對這個對象引用的線程通路。當一個線程可以通路一個對象的時候,也可以通路這個對象的成員變量。如果兩個線程同時通路一個對象的同一個方法,他們将會都通路成員變量,但是每一個線程都擁有這個成員變量的私有拷貝。
Java并發程式設計 - Java記憶體模型(JMM)
  • 當CPU需要讀取主存内容時,可以把資料讀到緩存中,然後讀取到寄存器中執行操作,當CPU需要回顯結果時候,會将内部寄存器的值重新整理到緩存中,然後某個時間點回顯到主存中。
Java并發程式設計 - Java記憶體模型(JMM)
  • 線程和主記憶體之間抽象的關系:Java記憶體模型(JVM)隻是對記憶體的實體劃分,隻局限在記憶體,而且是隻局限在JVM的記憶體,線程間的通信必須經過主記憶體。
  • 每個線程都有一個私有的本地記憶體,當線程A需要讀取主記憶體共享變量時拷貝共享變量的副本,放到本地,主記憶體就是硬體記憶體是為了擷取更好的運作速度,虛拟機和硬體系統可能會讓工作記憶體優先存儲于寄存器和高速緩存中。
Java并發程式設計 - Java記憶體模型(JMM)
Java并發程式設計 - Java記憶體模型(JMM)
Java并發程式設計 - Java記憶體模型(JMM)
Java并發程式設計 - Java記憶體模型(JMM)
Java并發程式設計 - Java記憶體模型(JMM)

繼續閱讀