標籤:描述 關聯 線程 記憶體回收 地區 jmm 類成員變數 結構 地方
幾個概念
java記憶體結構,也叫jvm記憶體結構,也可以叫也就是運行時的資料區域
記憶體模型
1、記憶體結構,
A、棧
棧和線程緊密關聯的。當建立線程的時候,會建立java棧,java棧又包含多個幀棧,方法啟動並執行時候,資訊就存在幀棧裡面,比如局部變數,傳回值,運算元等。Java棧資料不是線程共有的,所以不需要關心其資料一致性,也不會存在同步鎖的問題
B、堆
存放對象執行個體,以及數組,記憶體回收主要針對的就是這個地區,這裡的資料是線程共用的,所以不是安全執行緒的
C、方法區
類相關資訊,例如類成員變數,方法名,等資訊,當然包括類名,描述等資訊,方法區還包括常量池,存放的是字串,字面量等
D、程式計數器
由於java是多線程的,線程來回切換,程式計數器執行會指向幀棧的棧定,以表示程式執行到什麼位置了。
E、本地方法棧
和棧相似,只不過執行的java外部的方法,比如c++的方法。
2、記憶體模型
java記憶體模型主要程式房屋變數的規則,也就是java虛擬機器中的變數是如何儲存到主存中,以及如何從主存中取到虛擬機器中的這些細節。JMM規定了JMM規定了所有的變數都儲存在主記憶體(Main Memory)中。每個線程還有自己的工作記憶體(Working Memory),線程的工作記憶體中儲存了該線程使用到的變數的主記憶體的副本拷貝,線程對變數的所有操作(讀取、賦值等)都必須在工作記憶體中進行,而不能直接讀寫主記憶體中的變數,資料交換必須通過主存。
Java記憶體模型是圍繞著並發編程中原子性、可見度、有序性這三個特徵來建立的,
可見度,主記憶體中的資料修改,工作記憶體是可見的。立即知道。
有序性,主要是針對多線程執行時候,線程的一些操作一些先後的規則,這就是before-happen。例如volatile修飾的變數,寫操作先發生於讀操作,
所以衡量並發安全問題一切必須以happens-before 原則為準。
java記憶體模型