前面介紹了jvm運行時資料區域後,下面講解下對記憶體中資料的其他細節,看他們是如何創建、佈局及訪問的
#一、物件的建立
1.物件的指派
## 物件的建立分配方式主要有兩兩種:指標碰撞與空閒清單
指標碰撞:
# 假設堆中是絕對規則的整片規則,那麼,在為新物件分配記憶體空間時,只需要將指標往空閒空間方向移動新物件 所需大小的一段出來即可。 一般使用具有compact(整理)過程的收集器時,使用指標碰撞 #如果記憶體不是規則的,這時就需要維護一個列表,記錄哪些記憶體是空閒的,在分配空間時,從列表中找出一塊
# 足夠大的空間劃分為物件實例並更新清單記錄
使用基於mark-sweep演算法的收集器時,使用
空閒清單
#
2.物件的初始化與設定初始化
:記憶體分配完成後就是對物件進行初始化,虛擬機器將初始化的記憶體空間都初始化為0值, 這就是為什麼物件的實例欄位在java程式碼中不需要初始化也可以使用
#一些必要設置,主要是往物件頭中存入類別的元資料資訊、物件的雜湊值、分代年齡等。
init
: 經過上面兩步驟後物件建立完成,但所有欄位還都是0值。最後就是執行init方法,依照程式設計師的意思初始化物件完成上述三步驟後,一個物件就算創建完成。
二、物件的記憶體佈局物件在記憶體中儲存的佈局主要分為三部分,物件頭、實例資料、對齊填滿
物件頭
:物件頭在物件設定階段提到過物件,即在設定階段會向物件中存入一些物件中類別的元資料資訊、雜湊值、分代年齡等
物件中主要分為兩部分:運行時資料和類型指標 # 主要儲存上面物件設定階段儲存的雜湊碼、分代資訊、鎖定狀態標識、執行緒持有的鎖等。類型指針:主要儲存物件的類別元資料的指針,即這個物件是哪個類別的實例,此外,如果物件類型是數組, 中還會儲存一個代表資料長度的資料
對齊填充:不是必然存在的,在Hotspot中,要求物件起始位址必須是8位元組的倍數,
當物件實例部分未對齊時,用對齊填滿來補全。
三、物件的存取定位
java程式是透過堆疊上的reference資料來操作物件實例的,因此它只是一個引用,具體定位方式jvm有不同實作 主流實作方式有兩種:使用句柄和直接指標
柄
# 句 柄# 句
原理:java堆中會劃出一片區域作為句柄池,reference儲存的就是句柄位址,〔 # 好處:如果物件被移動,只需改變句柄池中儲存的位址
直接指標
##直接指標
##
直接指標[# 中儲存的就是物件的位址 好處:省去了一次定位的時間,效率更高# Hots使用的是直接指標方式使用的是直接指標方式
#
#
#
以上是JVM高階特性-二、JVM在堆中物件的分配、佈局、存取過程的詳細內容。更多資訊請關注PHP中文網其他相關文章!