Java虛擬機-對象的創建,對象頭

創建

  • new
  • 檢查new指令的參數,是否能在常量池中定位到一個類的引用符號
  • 檢查該類是否被加載、解析和初始化。 沒有則執行相應的過程
  • 分配內存 存在2中情況。取決於java內存堆是否規則
    a。指針碰撞 連續的只要移動指針即可 Serial、ParNew Compact等帶有壓縮整理的 使用此方法
    b。空閒列表 ; CMS 基於Mark-Sweep算法的 收集器的時候。
  • 考慮是否線程安全
    a: 同步,保證原子性
    b:本地線程分配緩衝 TLAB Thread Local Alloction Buffer 只有TLAB用完 才同步
  • 內存空間初始化爲零值
  • 對象頭 (hash碼 是否有偏向鎖, GC分代信息 元數據等

對象頭

a: 哈希碼,分代年齡
b:鎖,偏向鎖,偏向ID

對象的訪問定位

  • 句柄
    • java棧本地變量表中 reference指向句柄,句柄指向實例數據和類型數據
    • reference存放的是穩定的句柄地址
    • 對象移動只會改變句柄中的實例數據指針,不改變reference
  • 直接指針訪問
    • 速度快
    • 節省開銷
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章