1. 程式人生 > >jvm(三):對象

jvm(三):對象

線程安全 指針 word 自身 構造方法 解決 分享 碰撞 元數據

關於對象,我們需要面對的問題主要有對象的創建,對象在內存中的布局,對象的結構,對象的訪問定位。

對象的創建

對象的創建過程如下圖所示:

技術分享圖片

其主要步驟有:給對象分配內存,初始化對象,執行構造方法。

在對象創建過程中出現的線程安全性問題由線程同步和本地線程分配緩沖來解決

對象在內存中的布局

a、指針碰撞

技術分享圖片

b、空閑列表

技術分享圖片

對象內存的分配方式由堆內存是否規整決定,堆內存是否規整又有垃圾回收策略決定。如果堆內存規整則采用指針碰撞方式分配內存資源,如果堆內存不規整則采用空閑列表方式分配內存。

對象的結構

對象由三部分組成:

技術分享圖片

自身運行時數據(Mark Word)包含哈希值,GC分帶年齡,鎖狀態標誌,線程持有的鎖,偏向線程ID,偏向時間戳等

類型指針:指向類的元數據的指針,記錄對象的類型(並不是都存在)

對象的訪問定位

對象的訪問定位有兩種方式:

a、直接指針

技術分享圖片

棧內存的引用直接指向堆內存的引用,優點:簡單,減少了尋址的次數,性能比較高

b、使用句柄

技術分享圖片

棧內存的一個引用,指向堆內存的句柄池,由句柄池指向對象,優點:棧內存的引用不用發生變化,變得只是句柄池中指向對象的地址。

其實關於類的一些信息是存儲在方法區中的,也就是說,如果是直接指針方式的話,堆中的對象還有一個指向方法區的引用。如果是句柄方式的話,句柄池中還要包含一個指向方法區的引用。

jvm(三):對象