JVM系列 4 記憶體模型

2021-10-24 15:48:48 字數 2001 閱讀 8612

- 儲存器層次結構

從l6-l0 空間由大變小,速度由慢到快。

-快取一致性演算法

cpu實現快取一致性的協議很多,其中intel 使用的mesi(modified exclusive shared or invalid)協議。具體可以參考:[mesi–cpu快取一致性協議](

現代cpu的資料一致性實現=快取鎖(mesi…) +匯流排鎖

-快取行

快取讀取時的單位,一般是64byte

使用快取行的對齊能夠提高效率

-偽共享

位於同一快取行的2個不同的資料,被2個不同的cpu鎖定,產生互相影響的偽共享問題。

如何解決? 使用快取行的對齊能夠提高效率

cpu亂序問題

- 概念

cpu為了提高執行效率,會在一條指令執行的過程中(比如去內訪問資料(慢100倍)),去同時執行另一條指令,前提是兩條指令沒有依賴關係。具體參考:[現代cpu的合併寫技術對程式的影響](

-合併寫

cpu上有乙個writecombinbuffer,僅4個位元組,比l1等級還高,某些寫操作會合併在一起提交。[現代cpu的合併寫技術對程式的影響](

-亂序證明

cpu亂序現象有大佬寫程式模擬出來了,具體參考: memory reordering caught in the act

如何保證在特定情況下保證不亂序

硬體級別

x86 cpu級別記憶體屏障

sfence

store fence 在sfence指令前的寫操作必須在sfence指令後的寫操作前完成

lfence

load fence 在lfence指令前的讀操作必須在lfence指令後的讀操作前完成

mfence

mixed fence 在mfence指令前的讀寫操作必須在mfence指令後的讀寫操作前完成

cpu原子指令

如x86上的」lock …」 指令是乙個full barrier,執行時會鎖住記憶體子系統來確保執行順序,甚至跨多個cpu

總結: software locks通常使用了記憶體屏障或原子指令來實現變數可見性和保持程式順序

jvm級別
jsr113規範規定了4種記憶體屏障

loadload屏障

對於語句load1;loadload;load2,在load2及後續讀取指令要讀取的資料被訪問前,保證load1要讀取的資料被讀取完畢

storestore屏障

對於語句store1;storestore;store2,在store2及後續寫操作執行前,保證store1的寫入操作對其它處理器可見

loadstore屏障

對於語句load1;storestore;store2,在store2及後續寫操作被刷出前,保證load1要讀取的資料被讀取完畢

storeload屏障

對於語句store1;storestore;load2,在load2及後續讀取指令要執行前,保證store1的寫入操作對其它處理器可見

sychronized/volatile在位元組碼、jvm、硬體os層面實現細節

- sychronized

-volatile
​ loadloadbarrier ​ volatile 讀操作 ​ loadstorebarrier

jvm系列文章之jvm 記憶體模型

1.jvm記憶體模型按照執行緒私有與否劃分為兩類,執行緒私有類記憶體 執行緒棧,程式計數器,本地方法棧 和執行緒共享記憶體 堆,方法區or元空間 兩大類 執行緒棧 當類開始執行main方法後,位元組碼執行引擎就會為當前執行緒分配一塊記憶體區域,該區域詳細又可以根據執行的方法為main方法的後續方法分...

jvm記憶體模型 JVM記憶體模型詳情解析

一 結構圖 note string常量池 存在 堆記憶體中 二 各部分詳情解析 1 堆1 老年代 物件年齡 經過一次 monitor gc 年齡加1 15 的會存到 老年代 2 年輕代 3 常量池 string常量 儲存在堆中 2 虛擬機器棧 1 區域性變數表 2 運算元棧 3 動態鏈結 4 方法出...

jvm記憶體模型

主要分為棧,堆,方法區,程式計數器 1.程式計數器 2.棧 stack 虛擬機器棧 每個執行緒獨生成乙個棧,執行緒中每呼叫乙個方法生成乙個棧幀,棧幀依次壓棧 棧幀中存放了每個方法的基本資料變數,物件的引用,操作指令,出口資訊等 本地方法棧 存放的是native方法 其他語言寫的 其他和虛擬機器棧一樣...