Java內存結構,內存模型和對象模型

轉載:https://cloud.tencent.com/developer/article/1467468

Java作爲一種面向對象的,跨平臺語言,其對象,內存等都是一直比較難的知識點,而且很多概念的名稱看起來又那麼相似,很多人會傻傻分不清楚。比如本文我們要討論的JVM內存結構,Java內存模型和Java對象模型,這就是三個截然不同的概念,但是很多人容易弄混。

首先,這三個概念是完全不同的三個概念。本文主要對這三個概念加以區分以及簡單介紹。

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 Memory Model,JMM)

Java內存模型看上去和Java內存結構(JVM內存結構)差不多,很多人會誤以爲兩者是一回事兒,其實這兩者並不是同一概念,甚至這兩者之間是沒有任何關係的。

在前面的關於JVM內存結構的圖中,我們可以看到,其中Java堆和方法區的區域是多個線程共享的數據區域。也就是說,多個線程可能可以操作保存在堆或者方法區中的同一個數據。這也就是我們常說的“Java的線程間通過共享內存進行通信”。

JMM並不像JVM內存結構一樣是真實存在的。他只是一個抽象的概念。JSR-133:Java Memory Model and Thread Specification 中描述了,JMM是和多線程相關的,他描述了一組規則或規範,這個規範定義了一個線程對共享變量的寫入時對另外一個線程是可見的。

那麼,簡單總結下,Java多線程之間是通過共享內存進行通信的,而由於採用共享內存進行通信,在通信過程中會存在一系列如可見性,原子性,順序性等問題,而JMM就是圍繞着多線程通信以及其相關的一系列特性建立的模型。

JMM定義了一些語法集,這些語法集映射到Java語言中就是volatilesynchronized等關鍵字。

在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對象模型。
在這裏插入圖片描述
這就是一個簡單的Java對象的OOP-Klass模型,即Java對象模型。

總結一下

我們再來區分下Java內存結構,內存模型和對象模型這個三個概念

  • Java內存結構和Java虛擬機的運行時區域有關。
  • Java內存模型和Java的併發編程有關。
  • Java對象模型和Java對象在虛擬機中的表現形式有關。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章