jvm系列文章之jvm 記憶體模型

2022-03-06 10:16:49 字數 1126 閱讀 5180

1.jvm記憶體模型按照執行緒私有與否劃分為兩類,執行緒私有類記憶體(執行緒棧,程式計數器,本地方法棧)和執行緒共享記憶體(堆,方法區or元空間)兩大類;

執行緒棧:當類開始執行main方法後,位元組碼執行引擎就會為當前執行緒分配一塊記憶體區域,該區域詳細又可以根據執行的方法為main方法的後續方法分配棧空間,我們將這些相互隔離的乙個個記憶體空間叫做棧幀,這些棧幀的記憶體空間具體可分為四塊,分別是區域性變數表,運算元棧,動態鏈結,方法出口,其中區域性變數表我們可以簡單的理解為陣列,存放乙個個變數的引用位址,運算元棧是程式執行期間運算元臨時存放的地方,包括入棧和出棧,入棧是將運算元壓入棧頂,出棧的目的是將這些運算元交給cpu去執行相關的四則運算操作,操作後的結果又會被壓入棧中,等待後續操作,這些運算元會頻繁的在運算元棧和區域性變數表中交換訪問,動態鏈結相當於程式執行期間將字面常量代表的記憶體位址解析到對應的記憶體**塊,鏈結執行,

程式計數器的設計是為了解決多執行緒場景下由於執行緒上下文切換時記錄當前執行緒執行到位元組碼的行號,便於後期程式在原來執行的基礎上繼續執行,

本地方法棧是存放native方法相關的東西而分配的空間,

堆一般用來存放新建立的物件

方法區用來存放類資訊,靜態變數,常量池等資訊

棧與堆得關係大致可以理解為棧中區域性變數持有堆上物件的記憶體位址,堆與方法區的關係可以理解為堆上的物件被方法區的變數進行引用

2.關於堆得詳細說明,堆根據物件存在的時間劃分為新生代和老年代,新生帶佔堆總空間的1/3,老年代占用2/3,新生代又可劃分為eden區,約佔8/10,s1,s2各佔1/10,物件總是在eden區誕生,當物件不斷產生最終這8/10的空間不足以存放這些物件時,會觸發monitor gc進行垃圾**,垃圾**過程中將一些與引用物件相關聯的物件樹整個遷移到s1區,並將該物件的年齡+1,同時**掉垃圾物件,在**物件時,會存在stw問題,即就是stop the word,就是暫時停止使用者執行緒,由垃圾**機制負責**掉垃圾後使用者執行緒再繼續執行,當然,jvm設計這個策略是為了解決執行緒結束後棧記憶體會被釋放,這時候之前垃圾**收集的引用控制代碼也就無效了,無法找到垃圾物件,所以,無法在進行gc的時候不停止使用者執行緒。當物件不斷產生第二次觸發monitor gc時,**器會**eden區和s1區有用的物件到s2區,當物件年齡超過15後會被放入老年代,當老年代空間滿了的時候會觸發full gc,對無用垃圾進行**,若發現老年代這些物件仍然有用,則會報出oom異常

JVM系列 4 記憶體模型

儲存器層次結構 從l6 l0 空間由大變小,速度由慢到快。快取一致性演算法 cpu實現快取一致性的協議很多,其中intel 使用的mesi modified exclusive shared or invalid 協議。具體可以參考 mesi cpu快取一致性協議 現代cpu的資料一致性實現 快取鎖...

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

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

jvm記憶體模型

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