天天看點

Java記憶體模型深入詳解(JMM)(上)1 Java記憶體模型(JMM)的意義2 主記憶體與工作記憶體

Java記憶體模型深入詳解(JMM)(上)1 Java記憶體模型(JMM)的意義2 主記憶體與工作記憶體

1 Java記憶體模型(JMM)的意義

Java記憶體模型深入詳解(JMM)(上)1 Java記憶體模型(JMM)的意義2 主記憶體與工作記憶體
Java記憶體模型深入詳解(JMM)(上)1 Java記憶體模型(JMM)的意義2 主記憶體與工作記憶體
Java記憶體模型深入詳解(JMM)(上)1 Java記憶體模型(JMM)的意義2 主記憶體與工作記憶體
Java記憶體模型深入詳解(JMM)(上)1 Java記憶體模型(JMM)的意義2 主記憶體與工作記憶體

記憶體模型描述程式的可能行為。

Java虛拟機規範中試圖定義一種Java記憶體模型

來屏蔽掉各種硬體和作業系統的記憶體通路差異

,規定

  • 線程如何,何時能看到其他線程修改過的共享變量的值
  • 在必要時如何同步地通路共享變量

以實作讓Java程式在各種平台下都能達到一緻性的記憶體通路效果。

Java程式設計語言記憶體模型 通過檢查執行跟蹤中的每個讀操作,并根據某些規則檢查該讀操作觀察到的寫操作是否有效來工作。

隻要程式的所有執行産生的結果都可以由記憶體模型預測。具體的實作者任意實作,包括操作的重新排序和删除不必要的同步。

記憶體模型決定了在程式的每個點上可以讀取什麼值

1.1 Shared Variables 共享變量的描述

可以線上程之間共享的記憶體稱為

共享記憶體或堆記憶體

所有執行個體字段、靜态字段和數組元素都存儲在堆記憶體中

如果至少有一個通路是寫的,那麼對同一個變量的兩次通路(讀或寫)是沖突的。

https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.4.1

2 主記憶體與工作記憶體

  • 工作記憶體緩存
  • Java記憶體模型深入詳解(JMM)(上)1 Java記憶體模型(JMM)的意義2 主記憶體與工作記憶體
  • Java記憶體模型的主要目标是定義

    各個變量的通路規則

    即在虛拟機中将變量存儲到記憶體和從記憶體中取出變量值這樣的底層細節
  • 此處的變量包括了執行個體域,靜态域和構成數組對象的元素,但不包括局部變量與方法參數,因為後者是線程私有的,不存在競争

為了獲得比較好的執行效率,JMM并沒有限制執行引擎使用處理器的特定寄存器或緩存來和主記憶體進行互動,也沒有限制即時編譯器調整代碼執行順序這類權限。

JMM規定

所有的變量都存儲在主記憶體(Main Memory)

每條線程有自己的工作記憶體(Working Memory)

儲存了該線程使用到的變量的主記憶體副本拷貝(線程所通路對象的引用或者對象中某個線上程通路到的字段,不會是整個對象的拷貝!)

線程對變量的所有操作(讀,指派等)都必須在工作記憶體中進行,不能直接讀寫主記憶體中的變量

volatile變量依然有工作記憶體的拷貝,隻是他特殊的操作順序性規定,看起來如同直接在主記憶體讀寫

不同線程之間無法直接通路對方工作記憶體中的變量,線程間變量值的傳遞均要通過主記憶體

Java記憶體模型深入詳解(JMM)(上)1 Java記憶體模型(JMM)的意義2 主記憶體與工作記憶體
Java記憶體模型深入詳解(JMM)(上)1 Java記憶體模型(JMM)的意義2 主記憶體與工作記憶體

JVM模型與JMM不是同一層次的記憶體劃分,基本是沒有關系的,硬要對應起來,從變量,記憶體,工作記憶體的定義來看

  • 主記憶體 === Java堆中的對象執行個體資料部分
  • 工作記憶體 === 虛拟機棧中的部分區域
  • 從更底層的層次來說
  • 主記憶體直接對應于實體硬體的記憶體
  • 為了更好的運作速度,虛拟機(甚至硬體系統的本身的優化措施)可能會讓工作記憶體優先存儲于寄存器和高速緩存器中,因為程式運作時主要通路讀寫的是工作記憶體