一、結構圖
note: string常量池 存在 堆記憶體中
二、各部分詳情解析
1、堆1)老年代
物件年齡(經過一次 monitor gc 年齡加1) >15 的會存到 老年代
2)年輕代
3)常量池:
string常量 儲存在堆中
2、虛擬機器棧
1)區域性變數表
2)運算元棧
3)動態鏈結
4)方法出口資訊
note:棧中每乙個執行緒都會建立自己的棧幀,每個棧幀中又會分為以上四種資訊
原始碼及位元組碼解析棧
3、本地方法棧
和虛擬棧類似,只是儲存native修飾的 方法資訊
4、元資料區/元空間
1)類資訊
2)靜態變數
3)常量池
常量表型別
標誌值(佔1 byte)
描述constant_utf8
1utf-8編碼的unicode字串
constant_integer
3int型別的字面值
constant_float
4float型別的字面值
constant_long
5long型別的字面值
constant_double
6double型別的字面值
constant_class
7對乙個類或介面的符號引用
constant_string
8string型別字面值的引用
constant_fieldref
9對乙個欄位的符號引用
constant_methodref
10對乙個類中方法的符號引用
constant_inte***cemethodref
11對乙個介面中方法的符號引用
constant_nameandtype
12對乙個欄位或方法的部分符號引用
(1)constant_utf8用utf-8編碼方式來表示程式中所有的重要常量字串。這些字串包括:①類或介面的全限定名, ②超類的全限定名,③父介面的全限定名, ④類欄位名和所屬型別名,⑤類方法名和返回型別名、以及引數名和所屬型別名。⑥字串字面值
**式:tag(標誌1:佔1byte) length(字串所佔位元組的長度,佔2byte) bytes(字串位元組序列)
(2)constantinteger、 constantfloat、 constantlong、 constantdouble所有基本資料型別的字面值。比如在程式**現的1用constantinteger表示。3.1415926f用 constantfloat表示。
**式:tag bytes(基本資料型別所需使用的位元組序列)
(3)constantclass使用符號引用來表示類或介面。我們知道所有類名都以 constantutf8表的形式儲存。但是我們並不知道 constant_utf8表中哪些字串是類名,那些是方法名。因此我們必須用乙個指向類名字串的符號引用常量來表明。
**式:tag nameindex(給出表示類或介面名的constantutf8表的索引)
(4)constantstring同 constantclass,指向包含字串字面值的 constant_utf8表。
**式:tag stringindex(給出表示字串字面值的constantutf8表的索引)
(5)constantfieldref 、 constantmethodref、 constantinte***cemethodref指向包含該字段或方法所屬類名的 constantutf8表,以及指向包含該字段或方法的名字和描述符的 constant_nameandtype 表
**式:tag class index(給出包含所屬類名的constantutf8表的索引) nameandtypeindex(包含欄位名或方法名以及描述符的 constantnameandtype表 的索引)
(6)constantnameandtype指向包含欄位名或方法名以及描述符的 constantutf8表。
5、程式計數器
1)執行緒執行到的行號,native方法 行號為 null
三、記憶體溢位
會產生記憶體溢位的區域堆疊
元資料區(元空間)
note:只有程式計數器不會出現記憶體溢位
jvm記憶體模型
主要分為棧,堆,方法區,程式計數器 1.程式計數器 2.棧 stack 虛擬機器棧 每個執行緒獨生成乙個棧,執行緒中每呼叫乙個方法生成乙個棧幀,棧幀依次壓棧 棧幀中存放了每個方法的基本資料變數,物件的引用,操作指令,出口資訊等 本地方法棧 存放的是native方法 其他語言寫的 其他和虛擬機器棧一樣...
jvm記憶體模型
補充 可見性 乙個執行緒修改了變數,其他執行緒可以立即知道 保證可見性的方法 volatile synchronized unlock之前,寫變數值回主存 final 一旦初始化完成,其他執行緒就可見 有序性 在本執行緒內,操作都是有序的 重排或 主記憶體同步延時 指令重排 執行緒 內序列語義 寫後...
JVM 記憶體模型
恢復內容開始 學習狂神說筆記 感謝狂神說的分享 私有區一定不會有垃圾 所謂jvm的調優,其實就是在調整共享區中的堆,而且大多數情況下都在調堆 從 來解釋 class test 我們程式中給定的是 public static int a 1 但是在載入過程中的步驟如下 1.載入階段 編譯檔案為 cla...