JVM內存結構與Java內存模型
文章目錄
1)JVM內存結構
2)Java內存模型
JVM內存結構
- JVM內存結構,由Java虛擬機規範定義,描述的是Java程序執行過程中,由JVM管理的不同數據區域。
- Java代碼是運行在虛擬機上的,虛擬機在執行Java程序的過程中會把所管理的內存劃分爲若干個不同的數據區域,各個區域有其特定的功能。
- 1).PC寄存器
- 各個線程獨享
- 2).Java虛擬機棧
- 各個線程獨享
- 3).本地方法棧
- 各個線程獨享
- 4).Java堆
- 所有線程共享
- 5).方法區
- 所有線程共享
- 1).PC寄存器
- 棧內存與堆內存的區別
- 1.棧內存用來存儲局部變量和方法調用,堆內存用來存儲Java中的對象。
- 2.棧內存屬於單個線程,堆內存中的對象對所有線程可見,可以被所有線程訪問。
- 3.棧內存沒有可用的空間存儲方法調用和局部變量,會拋出StackOverFlowError,堆則會拋出OutofMemoryError
- 4.棧的內存要遠遠小於堆內存。
Java內存模型
- JMM並不像JVM內存結構一樣是真實存在的,只是一個抽象的概念。它與多線程相關,描述了一組規則或規範,定義了一個線程對共享變量的寫入時對另一個線程是可見的。
- Java多線程之間通過共享內存進行通信。
- JMM定義了一些語法集,這些語法集映射到Java語言中就是volatile、synchronized等關鍵字。
- 1.主內存
- 所有的變量(實例字段,靜態字段,構成數組對象的元素,但是不包括局部變量和方法參數)都必須在主內存中產生
- 2.工作內存
- 每個線程都有自己的工作內存,保存了線程需要的變量在內存中的副本。
- 線程對主內存變量的修改必須在線程的工作內存中進行,不能直接讀取主內存中的變量。
- 不同線程之間也不能相互訪問對方的工作內存,如需傳遞變量的值,必須通過主內存來作爲中介進行傳遞。
- 1.主內存
- 工作內存與主內存進行交互
- lock
- 作用於主內存的變量,一個變量在同一時間只能一個線程鎖定,表示這條線程獨佔這個變量。
- unlock
- read
- 把一個主內存變量的值傳輸到線程的工作內存
- load
- 把read操作從主內存中讀取的變量的值放到工作內存的變量副本中。
- use
- 把工作內存中的一個變量的值傳遞給執行引擎
- assign
- 把執行引擎返回的結果賦值給工作內存中的變量
- store
- 把工作內存中的變量的值傳遞給主內存
- write
- 把store操作得到的值放入主內存的變量中
- 從主內存傳輸到工作內存,執行read->load
- 從工作內存回寫到主內存,執行store->write
- lock
- java虛擬機中主內存和工作內存交互,就是一個變量如何從主內存傳輸到工作內存中,如何把修改後的變量從工作內存同步回主內存。
- 併發內存模型
- Java內存模型圍繞着併發過程中如何處理原子性、可見性和順序性這三個特徵來設計的。
- 1.原子性
- 在Synchronized塊之間的代碼都具有原子性
- 2.可見性
- volatile,synchronized,final可以實現可見性
- 3.有序性
- volatile禁止指令重排序
- synchronized 一個變量在同一時刻只能被一個線程對其lock操作