天天看點

并發2--java記憶體模型&jvm記憶體結構&java對象模型

要更好的了解并發問題,需要了解三個概念
  • jvm記憶體結構
  • java記憶體模型
  • java對象模型

jvm記憶體結構

衆所周知,java是運作在jvm虛拟機上,而虛拟機會将所管理的記憶體劃分為若幹個不同的資料區域,如圖(圖檔網上拷的)

并發2--java記憶體模型&jvm記憶體結構&java對象模型

方法區

方法區在以前的版本也可以稱之為永久代,主要用于存儲已被虛拟機加載的類型資訊,常量,靜态變量,即時編譯器編譯後的代碼等資料。

虛拟機棧

java虛拟機棧是線程私有,他的生命周期與線程相同。虛拟機展描述的是java方法執行的記憶體模型:每個方法在執行的同時都會建立一個棧幀,用于存儲局部變量表、操作數棧、動态連結、方法出口燈資訊。每一個方法從調用知道執行完成的過程,就對應着一個棧幀在虛拟機展中入棧到出棧的過程。

本地方法棧

本地方法棧與虛拟機棧的作用基本一樣,不同的是虛拟機為虛拟機執行java方法(也就是位元組碼)服務,而本地方法棧則為虛拟機使用到的native方法服務。

程式計數器

程式計數器是一塊較小的記憶體空間,它可以看做是目前線程所執行的位元組碼的剛好訓示器。由于java虛拟機的多線程是通過線程輪流切換并配置設定處理器執行時間的方式來實作的,在任何一個确定的的時刻,一個處理器(對于多核處理器來說是一個核心)都隻會執行一條線程中的指令。是以,為了線程切換能恢複到正确的執行位置,每條線程都需要有一個獨立的程式計數器。

java堆

是虛拟機中記憶體最大的一塊。堆是被所有線程共享的一塊記憶體區域,在虛拟機啟動時建立。此記憶體區域的唯一目的就是存在對象執行個體,幾乎所有的對象執行個體都在這裡配置設定記憶體。

java記憶體模型

java記憶體模型是根據英文java memory model 翻譯而來,簡稱JMM記憶體模型,jmm記憶體模型并不像jvm記憶體結構一樣真實存在,它隻是一個抽象概念。JMM是和多線程相關,它描述了一組規則或者叫規範,這個規範定義了多線程與記憶體之間的互動方式。

java的多線程是通過共享變量進行通信,在通信過程中會産生一系列如原子性、可見性、有序性的問題,而JMM就是圍繞着多線程通信以及與其相關的一系列特性而建立的模型。JMM定義了一些文法集,這些文法集映射到Java語言中就是volatile、synchronized等關鍵字。

并發2--java記憶體模型&jvm記憶體結構&java對象模型

java對象模型

java對象在JVM的存儲是有一定結構的,這個結構稱之為java對象模型。

java對象在jvm中是以oop-klass模型存在的。oop(instanceOopDesc)包含對象的對象頭和執行個體資料,而klass則表示這個對象的class,多個oop可以指向同一個klass(instanceKlass)。

并發2--java記憶體模型&jvm記憶體結構&java對象模型

總結

我們再來區分下JVM記憶體結構、 Java記憶體模型 以及 Java對象模型 三個概念。JVM記憶體結構,和Java虛拟機的運作時區域有關。 Java記憶體模型,和Java的并發程式設計有關。 Java對象模型,和Java對象在虛拟機中的表現形式有關。