JVM記憶體結構 VS Java記憶體模型 VS Java物件模型

來源:互聯網
上載者:User

標籤:term   詳細介紹   關於   ado   管理   JD   tsp   具體類   ceo   

Java作為一種物件導向的,跨平台語言,其對象、記憶體等一直是比較難的知識點。而且很多概念的名稱看起來又那麼相似,很多人會傻傻分不清楚。比如本文我們要討論的JVM記憶體結構、Java記憶體模型和Java物件模型,這就是三個截然不同的概念,但是很多人容易弄混。
可以這樣說,很多進階開發甚至都搞不不清楚JVM記憶體結構、Java記憶體模型和Java物件模型這三者的概念及其間的區別。甚至我見過有些面試官自己也搞的不是太清楚。不信的話,你去網上搜尋Java記憶體模型,還會有很多文章的內容其實介紹的是JVM記憶體結構。
首先,這三個概念是完全不同的三個概念。本文主要對這三個概念加以區分以及簡單介紹。其中每一個知識點都可以單獨寫一篇文章,本文並不會深入介紹,感興趣的朋友可以加入我的知識星球和球友們共同學習。
JVM記憶體結構
我們都知道,Java代碼是要運行在虛擬機器上的,而虛擬機器在執行Java程式的過程中會把所管理的記憶體劃分為若干個不同的資料區域,這些地區都有各自的用途。
其中有些地區隨著虛擬機器進程的啟動而存在,而有些地區則依賴使用者線程的啟動和結束而建立和銷毀。在《Java虛擬機器規範(Java SE 8)》中描述了JVM運行時記憶體地區結構如下:

各個地區的功能不是本文重點,就不在這裡詳細介紹了。這裡簡單提幾個需要特別注意的點:
1、以上是Java虛擬機器規範,不同的虛擬機器實現會各有不同,但是一般會遵守規範。
2、規範中定義的方法區,只是一種概念上的地區,並說明了其應該具有什麼功能。但是並沒有規定這個地區到底應該處於何處。所以,對於不同的虛擬機器實現來說,是有一定的自由度的。
3、不同版本的方法區所處位置不同,中劃分的是邏輯地區,並不是絕對意義上的物理地區。因為某些版本的JDK中方法區其實是在堆中實現的。
4、運行時常量池用於存放編譯期產生的各種字面量和符號應用。但是,Java語言並不要求常量只有在編譯期才能產生。比如在運行期,String.intern也會把新的常量放入池中。
5、除了以上介紹的JVM運行時記憶體外,還有一塊記憶體地區可供使用,那就是直接記憶體。Java虛擬機器規範並沒有定義這塊記憶體地區,所以他並不由JVM管理,是利用本地方法庫直接在堆外申請的記憶體地區。
6、堆和棧的資料劃分也不是絕對的,如HotSpot的JIT會針對對象分配做相應的最佳化。
如上,做個總結,JVM記憶體結構,由Java虛擬機器規範定義。描述的是Java程式執行過程中,由JVM管理的不同資料區域。各個地區有其特定的功能。
Java記憶體模型
Java記憶體模型看上去和Java記憶體結構(JVM記憶體結構)差不多,很多人會誤以為兩者是一回事兒,這也就導致面試過程中經常答非所為。
在前面的關於JVM的記憶體結構的圖中,我們可以看到,其中Java堆和方法區的地區是多個線程共用的資料區域。也就是說,多個線程可能可以操作儲存在堆或者方法區中的同一個資料。這也就是我們常說的“Java的線程間通過共用記憶體進行通訊”。
Java記憶體模型是根據英文Java Memory Model(JMM)翻譯過來的。其實JMM並不像JVM記憶體結構一樣是真實存在的。他只是一個抽象的概念。JSR-133: Java Memory Model and Thread Specification 中描述了,JMM是和多線程相關的,他描述了一組規則或規範,這個規範定義了一個線程對共用變數的寫入時對另一個線程是可見的。
那麼,簡單總結下,Java的多線程之間是通過共用記憶體進行通訊的,而由於採用共用記憶體進行通訊,在通訊過程中會存在一系列如可見度、原子性、順序性等問題,而JMM就是圍繞著多線程通訊以及與其相關的一系列特性而建立的模型。JMM定義了一些文法集,這些文法集映射到Java語言中就是volatile、synchronized等關鍵字。
在JMM中,我們把多個線程間通訊的共用記憶體稱之為主記憶體,而在並發編程中多個線程都維護了一個自己的本地記憶體(這是個抽象概念),其中儲存的資料是主記憶體中的資料拷貝。而JMM主要是控制本地記憶體和主記憶體之間的資料互動的。

在Java中,JMM是一個非常重要的概念,正是由於有了JMM,Java的並發編程才能避免很多問題。這裡就不對Java記憶體模型做更加詳細的介紹了,想瞭解更多的朋友可以參考《Java並發編程的藝術》。
Java物件模型
Java是一種物件導向的語言,而Java對象在JVM中的儲存也是有一定的結構的。而這個關於Java對象自身的儲存模型稱之為Java物件模型。
HotSpot虛擬機器中,設計了一個OOP-Klass Model。OOP(Ordinary Object Pointer)指的是普通對象指標,而Klass用來描述對象執行個體的具體類型。
每一個Java類,在被JVM載入的時候,JVM會給這個類建立一個instanceKlass,儲存在方法區,用來在JVM層表示該Java類。當我們在Java代碼中,使用new建立一個對象的時候,JVM會建立一個instanceOopDesc對象,這個對象中包含了對象頭以及執行個體資料。

這就是一個簡單的Java對象的OOP-Klass模型,即Java物件模型。
總結
我們再來區分下JVM記憶體結構、 Java記憶體模型 以及 Java物件模型 三個概念。
JVM記憶體結構,和Java虛擬機器的運行時地區有關。
Java記憶體模型,和Java的並發編程有關。
Java物件模型,和Java對象在虛擬機器中的表現形式有關。
關於這三部分內容,本文並未分別展開,因為涉及到的知識點實在太多,如果讀者感興趣,可以自行學習。後面也會發文介紹這些內容,敬請期待。
最後,這三個概念非常重要,一定要嚴格區分開,千萬不要在面試中出現答非所為的情況。

JVM記憶體結構 VS Java記憶體模型 VS Java物件模型

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.