首頁  >  文章  >  Java  >  JVM高階特性-二、JVM在堆中物件的分配、佈局、存取過程

JVM高階特性-二、JVM在堆中物件的分配、佈局、存取過程

巴扎黑
巴扎黑原創
2017-06-26 11:31:441727瀏覽

  前面介紹了jvm運行時資料區域後,下面講解下對記憶體中資料的其他細節,看他們是如何創建、佈局及訪問的

  #一、物件的建立

 

   1.物件的指派

## 

   物件的建立分配方式主要有兩兩種:

指標碰撞與空閒清單

 

   

指標碰撞:  

#     假設堆中是絕對規則的整片規則,那麼,在為新物件分配記憶體空間時,只需要將指標往空閒空間方向移動新物件

   所需大小的一段出來即可。

 

     一般使用具有compact(整理)過程的收集器時,使用指標碰撞

 

#   

     如果記憶體不是規則的,這時就需要維護一個列表,記錄哪些記憶體是空閒的,在分配空間時,從列表中找出一塊

#   足夠大的空間劃分為物件實例並更新清單記錄

 

   使用基於mark-sweep演算法的收集器時,使用

空閒清單

#   

2.物件的初始化與設定

      

初始化

:記憶體分配完成後就是對物件進行初始化,虛擬機器將初始化的記憶體空間都初始化為0值,      這就是為什麼物件的實例欄位在java程式碼中不需要初始化也可以使用

      

#一些必要設置,主要是往物件頭中存入類別的元資料資訊、物件的雜湊值、分代年齡等。

      init

: 經過上面兩步驟後物件建立完成,但所有欄位還都是0值。最後就是執行init方法,依照程式設計師的意思初始化物件

      完成上述三步驟後,一個物件就算創建完成。

 

   

二、物件的記憶體佈局

     物件在記憶體中儲存的佈局主要分為三部分,物件頭、實例資料、對齊填滿

     

物件頭

       物件頭在物件設定階段提到過物件,即在設定階段會向物件中存入一些物件中類別的元資料資訊、雜湊值、分代年齡等

       物件中主要分為兩部分:運行時資料和類型指標

      #  主要儲存上面物件設定階段儲存的雜湊碼、分代資訊、鎖定狀態標識、執行緒持有的鎖等。

         

類型指針:主要儲存物件的類別元資料的指針,即這個物件是哪個類別的實例,此外,如果物件類型是數組,              中還會儲存一個代表資料長度的資料

         對齊填充:不是必然存在的,在Hotspot中,要求物件起始位址必須是8位元組的倍數,

         當物件實例部分未對齊時,用對齊填滿來補全。

   三、物件的存取定位

     java程式是透過堆疊上的reference資料來操作物件實例的,因此它只是一個引用,具體定位方式jvm有不同實作     主流實作方式有兩種:使用句柄和直接指標      

       柄

# 句     柄

# 句 

       原理:java堆中會劃出一片區域作為句柄池,reference儲存的就是句柄位址,

        

      〔 #              好處:如果物件被移動,只需改變句柄池中儲存的位址

     

直接指標

##     

直接指標

##    

直接指標[# 中儲存的就是物件的位址

       好處:省去了一次定位的時間,效率更高

 

#     Hots使用的是直接指標方式使用的是直接指標方式

#      

#          

            

    

#

以上是JVM高階特性-二、JVM在堆中物件的分配、佈局、存取過程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn