1. 程式人生 > >讀書筆記《深入理解Java虛擬機器》 (二)物件建立、記憶體佈局、訪問定位

讀書筆記《深入理解Java虛擬機器》 (二)物件建立、記憶體佈局、訪問定位

物件的建立

  • 類載入檢查
  1. 檢查這個指令的引數是否能在常量池中定位到一個類的引用
  2. 檢查這個符號引用代表的類是否已被載入、解析和初始化過, 如果沒有,那必須先執行相應的類載入過程
  3. 確定物件所需記憶體的大小
  • 為新生物件分配記憶體
  • 初始化物件的欄位, 大概例如 int型別的初始值0就是在這裡初始化的吧
  • 對物件進行必要的設定,設定物件頭資訊(物件的雜湊碼、GC分代年齡等)
  • 執行<init>方法

物件的記憶體佈局

  • 物件頭
  1. 第一部分:儲存物件自身的執行時資料,如雜湊碼、GC分代年齡、鎖狀態標誌、執行緒持有的鎖等
  2. 第二部分:型別指標,虛擬機器可以通過這個指標來確定這個物件是哪個類的例項。不是必須;如果物件是一個java陣列,物件頭還必須記錄陣列長度,因為從陣列的元資料中無法確定陣列的大小,物件可以;然後是例項資料,無論是父類繼承的,還是子類定義的,相同寬度的欄位總是分配到一起
  3. 第三部分:對齊填充,不是必然存在的。物件的大小必須是8位元組的倍數,當物件大小不足以對齊時,就需要通過對齊填充來對齊

物件的訪問定位

  • 第一種,通過控制代碼訪問,在java堆中劃分出來一塊記憶體作為控制代碼池,控制代碼池記錄了物件例項資料、型別資料的指標,在java棧本地變量表中記錄了控制代碼池的地址。優點:當控制代碼池中的指標有變化時,java棧中的地址可以不變。
  • 第二種,通過直接地址訪問,優點是比控制代碼訪問方式速度更快,節省了定位控制代碼池。