JAVA內存模型 VS JVM運行時數據區

JVM運行時數據區

jvm運行時內存

線程共享:所有線程能訪問這塊內存數據,隨虛擬機或者GC而創建和銷燬
線程獨佔:每個線程都會有他獨立的空間,隨線程生命週期而創建和銷燬

  • 線程共享部分又包含方法區堆內存

    方法區:用來存放類信息、常量、靜態變量、編譯後的代碼等數據,虛擬機規範中這是一個邏輯劃分,具體實現根據不同的虛擬機來實現。比如oracle的Hotspot虛擬機在java7中放在永久代,java8中放在元數據空間,且通過GC機制對這塊區域進行管理。
    堆內存:用來存放對象,隨JVM的啓動而創建。又可細分爲新生代(Eden、From Survivor、To Survivor)、老年代 。垃圾回收器主要管理的就是這塊區域,如果滿了會拋出OutOfMemeryError

  • 線程獨佔部分又包含虛擬機棧本地方法棧程序計數器

    虛擬機棧:每個線程都在這個空間有一個私有的空間。線程棧由多個棧幀組成。一個線程會執行一個或多個方法,一個方法對應一個棧幀。棧幀內容包含:局部變量表、操作數棧、動態鏈接、方法返回地址、附加信息等。棧內存默認最大值是1M,超出則拋出StackOverflowError
    本地方法棧:作用於虛擬機棧一樣,主要區別在於虛擬機棧用來執行java方法,本地方法棧是爲虛擬機執行native方法準備的。同樣,超出大小後會拋出StackOverflowError
    程序計數器:記錄當前線程執行的字節碼的位置,存儲的是字節碼指令地址,如果執行Native方法,則計數器值爲空。
    每個線程都在這個空間有一個私有空間,佔用的內存空間很少。
    CPU同一時間,只會執行一條線程中的指令。JVM多線程會輪流切換並分配,CPU執行時間的方式,爲了線程切換後,需要通過程序計數器,來恢復正確的執行位置。

JAVA內存模型

java內存模型是由《JAVA語言規範》定義的,用來描述多線程程序語義執行的規則。它包含了多個線程修改了共享內存中的值,應該讀取到哪個值的規則。其中的幾個概念列舉如下:

  • 原子性:原子性是指一個操作是不可中斷的。即使是在多個線程一起執行的時候,一個操作一旦開始,就不會被其它線程干擾。
  • 有序性:是指在程序執行的時候,是按字節碼指令順序進行執行。
  • 可見性:可見性是指當一個線程修改了某一個共享變量的值,其他線程是否能夠立即知道這個修改。
  • Happen-Before規則:
    • 程序順序原則:一個線程內保證語義的串行性
    • volatile規則:volatile變量的寫,先發生於讀,這保證了volatile變量的可見性
    • 鎖規則:解鎖(unlock)必然發生在隨後的加鎖(lock)前
    • 傳遞性:A先於B,B先於C,那麼A必然先於C
    • 線程的start()方法先於他的每一個動作
    • 線程的所有操作先於線程的終結(Thread.join())
    • 線程的中斷(interrupt())先於被中斷線程的代碼
    • 對象的構造函數執行結束先於finalize()方法

JAVA內存模型 VS JVM運行時數據區

在這裏插入圖片描述

Java內存模型是由《Java語言規範》定義的,用來描述多線程程序語義執行的規則
JVM運行時數據區是由《Java虛擬機規範》定義的,用來描述java虛擬機執行時內存的特點

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章