JDK1 8 JVM記憶體模型個人理解

2022-09-06 06:27:12 字數 1219 閱讀 5312

每條執行緒都會有乙個獨立的程式計算器,各條執行緒之間互不影響,獨立儲存,我們稱這類記憶體區域為「執行緒私有」的記憶體。如果當前執行緒執行的是native方法,則其值為null。

執行緒私有,每個方法在執行的同時都會建立乙個棧幀用於儲存區域性變數、運算元棧、動態鏈結、方法出口等資訊。每乙個方法從呼叫直至執行完成的過程,就對應著乙個棧幀在虛擬機器棧中入棧到出棧的過程。

區域性變數為各種資料型別(8種基本型別)、物件引用(reference型別)

本地方法棧與虛擬機器棧所發揮的作用是非常相似的,它們之間的區別不過是虛擬機器棧為虛擬機器執行j**a方法服務,而本地方法棧則為虛擬機器使用到的native方法服務。

j**a堆是被所有執行緒共享的一塊記憶體區域,在虛擬機器啟動時建立。此記憶體區域的唯一目的就是存放物件例項,幾乎所有的物件例項都在這裡分配記憶體。

j**a堆是垃圾收集器管理的主要區域,收集器主要使用分代收集演算法,所以j**a堆中還可以細分為:新生代和老年代;(eden空間、from survivor空間、to survivor空間等)分配緩衝區。

而網上說的j**a堆記憶體是執行緒共享的!面試官:你確定嗎?,說的是堆tlab的方案,每個執行緒在初始化時都會在eden劃分一塊空間給當前執行緒使用,這塊空間是本地執行緒獨享的。意味著執行緒分配是獨享的,但讀取和垃圾**是執行緒共享的。

它主要儲存已被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的**等資料。

j**a中的常量池,實際上分為兩種形態:靜態常量池和執行時常量池。

靜態常量池就是 string a1 = "123";這種在編譯時確定好的。

執行時常量池就是 string a2 = new string("123");這種在執行時需要去堆建立乙個物件的。

區別如圖

jvm記憶體模型 JVM記憶體模型詳情解析

一 結構圖 note string常量池 存在 堆記憶體中 二 各部分詳情解析 1 堆1 老年代 物件年齡 經過一次 monitor gc 年齡加1 15 的會存到 老年代 2 年輕代 3 常量池 string常量 儲存在堆中 2 虛擬機器棧 1 區域性變數表 2 運算元棧 3 動態鏈結 4 方法出...

jvm記憶體模型

主要分為棧,堆,方法區,程式計數器 1.程式計數器 2.棧 stack 虛擬機器棧 每個執行緒獨生成乙個棧,執行緒中每呼叫乙個方法生成乙個棧幀,棧幀依次壓棧 棧幀中存放了每個方法的基本資料變數,物件的引用,操作指令,出口資訊等 本地方法棧 存放的是native方法 其他語言寫的 其他和虛擬機器棧一樣...

jvm記憶體模型

補充 可見性 乙個執行緒修改了變數,其他執行緒可以立即知道 保證可見性的方法 volatile synchronized unlock之前,寫變數值回主存 final 一旦初始化完成,其他執行緒就可見 有序性 在本執行緒內,操作都是有序的 重排或 主記憶體同步延時 指令重排 執行緒 內序列語義 寫後...