前面幾篇文章中, 系統的學習了下JVM內存結構、Java內存模型、Java對象模型, 但是發現自己還是對這三者的概念和區別比較模糊, 傻傻分不清楚。所以就有了這篇文章, 本文主要是對這三個技術點再做一個總結和區分, 加深印象。
JVM內存結構
在《Java虛擬機規范(Java SE 8)》中描述了JVM運行時內存區域結構如下:
也就是說, JVM內存結構由Java虛擬機規范定義, 其描述的是Java程序執行過程中, 由JVM管理的不同的數據區域。
Java內存模型
在計算機世界中, 為了保證共享內存的正確性(原子性、可見性、有序性), 內存模型定義了共享內存系統中多線程程序讀寫操作行為的規范。通過這些規則來規范對內存的讀寫操作, 從而保證指令執行的正確性。它與處理器有關、與緩存有關、與並發有關、有編譯有關。它解決了CPU多級緩存、處理器優化、指令重排等導致的訪問問題, 保證了並發場景下的有序性、一致性、原子性。
內存模型解決並發問題主要采用兩種方式: 限制處理器優化和使用內存屏障。
我們知道, Java的多線程之間是通過共享內存進行通信的, 而由於采用共享內存進行通信, 在通信過程中會存在一系列如可見性、原子性、順序性等問題, 而JMM(Java Memory Model)就是圍繞着多線程通信以及與其相關的一系列特性而建立的模型。它只是一個抽象的概念, 是一種符合內存模型規范的,屏蔽了各種硬件和操作系統的訪問差異的,保證了Java程序在各種平台下對內存的訪問都能保證效果一致的機制及規范。JMM定義了一些語法集, 這些語法集映射到Java語言中就是volatile、synchronized等關鍵字。
Java對象模型
Java是一種面向對象的語言,而Java對象在JVM中的存儲也是有一定的結構的。而這個關於Java對象自身的存儲模型稱之為Java對象模型。
HotSpot虛擬機中,設計了一個OOP-Klass Model。OOP(Ordinary Object Pointer)指的是普通對象指針,而Klass用來描述對象實例的具體類型。
如下圖所示, 就是一個簡單的Java對象的OOP-Klass模型,即Java對象模型。
小結
最后, 我們再對這三個概念做一個簡單的區分。JVM內存結構, 和Java虛擬機的運行時區域有關。Java內存模型, 和Java的並發編程有關。Java對象模型, 和Java對象在虛擬機中的表現形式有關。