摘要:
????????本文簡單分析了Java虛擬機的核心運行機制。首先介紹了基本數據類型在32位和64位虛擬機中的存儲差異,說明slot槽設計以空間換時間的優化思路。其次詳細解析了對象在堆內存中的存儲結構,包括對象頭、對象數據和對齊填充機制。然后探討了方法調用的實現原理,包括靜態綁定和動態綁定兩種方式。接著闡述了異常捕獲通過異常表實現的機制。最后簡要介紹了JIT即時編譯器的關鍵技術,包括方法內聯和逃逸分析。全文從底層視角揭示了JVM高效運行的關鍵技術原理。
一,基本數據類型
????????32位虛擬機中,slot槽占4個字節,64位中占8個字節,這一設計以空間換時間,避免不同數據類型不同處理方式帶來的開銷,也保證了對虛擬機的適配性
數據類型 | 堆(字節) | 棧slot槽(4/8字節) |
byte | 1 | 1 |
short | 2 | 1 |
int | 4 | 1 |
long | 8 | 2 |
float | 4 | 1 |
double | 8 | 2 |
char | 2 | 1 |
boolean | 1 | 1 |
(1)堆-->棧
boolean、char為無符號,低位復制,高位補零;byte、short有符號,低位復制,高位非負則補0,負則補1。
(2)棧-->堆
二,對象在堆中的存儲(普通對象/數組對象)
【1】對象頭
1,標記字段
主要記錄該類的一些特定信息,如:鎖狀態,hashcode值,存活壽命(垃圾回收)等等
2,元數據的指針
指向方法區的InstanceKlass對象,64位虛擬機默認占8個字節,會進行指針壓縮-->4個字節
【2】對象數據
1,對象屬性
(1)字段對應的offset必須被該字段的數據類型整除,如果不能整除會調整字段的前后位置,通過數據重排來保證或者對象填充。
2,內存對齊填充
????????內存對齊填充是一種優化技術,用于確保對象在堆內存中的布局滿足特定邊界對齊要求。這主要是為了提高CPU訪問內存的效率,避免兩個不同的對象分配到同一個緩存行中可能導致性能下降
(1)?CPU訪問內存時,如果數據地址是某個對齊值(如8字節)的倍數,訪問速度更快。例如,在64位系統中,常見對齊要求是8字節。
(2)對象頭包含元數據(如鎖狀態、GC信息),大小通常為12字節(在64位JVM中,8字節mark word + 4字節klass pointer)。但為了對齊,JVM可能會添加填充字節。
三,方法的調用
????????方法的調用通過虛擬機棧來實現-->每當調用一個方法就會生成一個對應的棧幀,方法結束棧幀銷毀。
1,四種方法調用的字節碼指令
2,方法調用的原理
解決怎么樣在保存了多個類和多個方法的方法區中找到對應的方法的字節碼數據
(1)靜態綁定
(2)動態綁定(實現多態)
四,異常捕獲的原理
????????通過異常表來實現異常捕獲,異常表主要包含表號、啟始PC、結束PC、跳轉PC和異常捕獲類型(RuntimeException...)關鍵信息
?1,Family的實現
五,Jit即時編譯器
1,方法內聯
2,逃逸分析(標量替換)
?3,總結