經歷過很多面試大部分都會問一句: 你知道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