1. 程式人生 > >jvm學習筆記之對象詳解

jvm學習筆記之對象詳解

時間 分代 創建 com 詳解 要求 技術 wid src

一、對象的組成

      技術分享

    對象頭(Header):

          運行時數據:存儲對象運行時的數據,如哈希碼、GC分代年齡、鎖狀態標誌、線程持有的鎖、偏向線程ID、偏向時間戳等,這部分數據官方成為“Mark Word”,它的長度在32位和64位的虛擬機中分別是32bit和64bit。32bit的HotSpot虛擬機中,當對象未被鎖定時的組成如下表:

                  技術分享

          類型指針:對象指向它的類元數據的指針,虛擬機通過這個指針來確定這個對象是哪個類的實例

    實例數據:對象真正存儲的有效信息,也是在程序中所定義的各種類型的字段內容

    對齊填充:

這部分不是必然存在的,也沒有特別的含義,它僅僅起著占位符的作用。由於HotSpot VM的自動內存管理系統要求對象起始地址必須是8字節的整數倍,

          也就是說對象必須是8字節的整數倍,因此當實例數據不是8字節的倍數的時候就需要占位符來填充

二、對象的創建

      1、虛擬機接收到new指令

      2、檢查這個指令的參數能否在常量池中定位到一個類的符號引用,並且這個類是否已經被加載、解析和初始化過,如果沒有則先執行類的加載過程

      3、虛擬機為新生對象分配內存空間

      4、將對象中的實例數據都初始化為零值

      5、設置對象的header部分的數據

      6、設置對象的實例數據

三、對象的訪問

    在java程序總使用對象需要通過棧上的reference數據來操作堆上的對象。由於reference類型在java虛擬機規範中只規定了一個指向對象的引用,並沒有定義這個引用通過

  何種方式去定位、訪問堆中的對象的具體位置,所以對象訪問方式是取決於虛擬機的實現的。目前主流的訪問方式有使用句柄和直接指針兩種。

  使用句柄方式:   

    使用句柄訪問方式的最大好處就是reference中存儲的是穩定的句柄地址,在對象被移動(GC操作時移動對象是非常普遍的行為)時只會改變句柄中的實例數據指針,而

 reference本身不需要修改。

        技術分享

   直接指針訪問方式:     

    使用直接指針方式訪問的最大好處是速度更快,它節省了一次指針定位的時間開銷,由於對象的訪問在java中非常頻繁,因此這類開銷積少成多後也是一項非常可觀的的執

   行成本

          技術分享

  

jvm學習筆記之對象詳解