JMM(java Memory Model)到底是什么?


經歷過很多面試大部分都會問一句: 你知道Java內存模型么?  然后我就pulapula的說一大堆什么堆呀,棧呀,GC呀什么的,這段時間把JVM虛擬機和多線程編程完整的學習了一遍,發現JMM和堆/棧這些完全不是一個概念,不知道是不是就是因為這才被拒了十來次的 /尷尬。

JVM是Java實現的虛擬計算機(Java Virtual Machine),對於熟悉計算機結構的同學,我感覺把這些概念和物理機對應起來更好理解。

JVM對應的就是物理機,它有存放數據的存儲區:堆、棧等由JVM管理的內存(對應於物理機的內存)、執行數據計算的執行單元:線程(對應於物理機的CPU)、加速線程執行的本次存儲區:可能會從存儲區里分配一塊空間來存儲線程本地數據,比如棧(對應於物理機的cache)。

眾所周知,現代計算機一般都會包含多個處理器,多個處理器共享主內存。為了提升性能,會在每個處理器上增加一個小容量的cache加速數據讀寫。cache會導致了緩存一致性問題,為了解決緩存一致性問題又引入了一系列Cache一致性協議(比如MSI、MESI、MOSI、Synapse、Firefly及Dragon Protocol)來解決CPU本地緩存和主內存數據不一致問題。

而JVM中管理下的存儲空間(包括堆、棧等)就對應與物理機的內存;

線程本次存儲區(例如棧)就對應於物理機的cache;

而JMM就對應於類似於MSI、MESI、MOSI、Synapse、Firefly及Dragon Protocol這樣的緩存一致性協議,用於定義數據讀寫的規則。

JMM相對於物理機的緩存一致性協議來說它還要處理JVM自身特有的問題:重排序問題,參見: http://cmsblogs.com/?p=2116。

那么JMM都有哪些內容呢? 

官方文檔: http://101.96.10.64/www.cs.umd.edu/~pugh/java/memoryModel/CommunityReview.pdf

通俗理解就是happens-before原則 https://www.cnblogs.com/chenssy/p/6393321.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM