java'記憶體模型
- java記憶體模型是什麼
-
- 1. 緩存一緻性協定---可見性
- 2. 處理器優化---原子性
- 3. 指令重排序---有序性
- java運作時資料區
-
- 1. 堆
- 2. 方法區
- 3. java虛拟機棧
- 4. 本地方法棧
- 5. 程式計數器
java記憶體模型是什麼
java記憶體模型是共享記憶體的并發模型,線程之間通過讀—寫共享變量來完成隐式的通信;
java記憶體模型控制線程之間的通信,決定某個線程對共享記憶體的寫入何時對另一個線程可見。
java記憶體模型就是為了解決以下玉玉多線程通過共享記憶體通信時,緩存不一緻、處理器對代碼執行亂序、編譯器對指令重排序三種問題應運而生。
在多線程情況下,通過共享記憶體通信産生的三種問題提出了java記憶體模型
1. 緩存一緻性協定—可見性
計算機在高速的CPU和相對低速的主存之間速度不比對的情況下,中間需要高速緩存catch進行緩沖。将運算所需的資料從主存複制到高速緩存中,CPU直接在高速緩存中存取資料,将運算結果放到高速緩存,再從高速緩存中同步到主存中。再多個CPU處理任務涉及同一塊主存區域時,就可能導緻緩存不一緻的問題,是以在高速緩存和主存之間必須遵守一個緩存一緻性協定。
2. 處理器優化—原子性
進一步提高CPU的執行效率,為了處理器内部運算單元能夠被最大化充分利用,會将輸入的代碼亂序執行處理,這就是處理器優化。
3. 指令重排序—有序性
現代的處理器采用指令級并行技術将多條指令重地執行,如果不存在資料依賴性,處理器會改變語句對應機器指令的執行順序,這就是指令重排序。
java運作時資料區
java運作時資料區将java記憶體劃分為5個區域,堆、方法區、本地方法棧、java虛拟機棧、程式計數器
1. 堆
堆是線程共享的記憶體區域,存放對象執行個體。是垃圾回收的主要區域。
堆可分為新生代和老年代,新生代又可細分為Eden區、Survivor from區和Survivor to區。
2. 方法區
方法區是線程共享的記憶體區域,存放已被虛拟機加載的類資訊,靜态變量、常量、即時編譯器編譯後的代碼等資料。
3. java虛拟機棧
java虛拟機棧是線程私有的記憶體區域,描述java線程執行的記憶體模型,每個方法在執行的時候,都會建立一個棧幀,棧幀裡面存放局部變量表、操作數棧、方法出口、動态連結等資訊。每個方法對應一個棧幀。
局部變量表存放了基本類型、對象引用和方法傳回類型(指向了一條位元組碼指令位址)。
4. 本地方法棧
本地方法棧是線程私有的記憶體區域,裡面的方法都有關鍵字native,是直接和系統互動的方法, 使用非java語言實作。
5. 程式計數器
程式計數器是線程私有的記憶體區域,用于儲存該線程執行到哪裡,下一條指令的位置。