前言:
所謂的物件其實就是透過java類別所產生的實體。
例如:蓋樓房的圖紙就是Java類,根據這個圖紙修建起來的能夠被看見,被使用的這個實際存在的樓房,就是相當於是用過這個圖紙得到的對象。
Java類別實際上是一個抽象意義上的概念,而物件就是透過這個java類別的抽象概念具體化之後的一個具體概念。
在HotSpot虛擬機器中,也就是我們的常用虛擬機器。物件組成分為3個區域:物件頭、實例資料、對齊填充。
物件頭
物件頭分為兩個部分:物件本身運行時的數據,類型指標
物件本身運行時的數據,例如:HashCode、鎖定狀態標誌、線程持有的鎖、偏向線程ID、偏向時間戳記、GC分代年齡等。這部分資料長度在32位元和64位元虛擬機器(若未開啟壓縮指標)下分別為32bit和64bit。這部分稱為"Mark Word"。
並且Mark Word 被設計為沒有固定的資料結構用來在很小的空間內可以儲存更多的信息,它會根據不同的狀態儲存不同的資料。例如在32位情況下,儲存內容的變化如下
類型指針,也就是指向此物件的類別元資料的指針,也就是透過這個指針來知道這個物件是哪個類別的實例,但是不是所有的虛擬機器實作都是透過這個來尋找類別的元資料的。
像HotSpot虛擬機,我們都知道平時new了一個物件保存的是這個物件的引用,這個引用儲存的是物件實例的位址,而有些虛擬機的實作是這個引用儲存的是一個物件的句柄位址,句柄位址又包含了物件實例位址和物件類型位址。
也就是這類虛擬機器有一個句柄池,句柄池內部儲存了物件的實例資料位址和類別資料位址,所以這類虛擬機器可以直接透過句柄池中類別資料位址去找到這個對象是屬於哪個類別的實例。
(學習影片分享:java影片教學)
#如果物件是數組,那還需要一塊地方來記錄資料的長度。
實例資料
實例資料就是物件真正儲存的資料區,各種類型的欄位內容。
對齊填色
這部分內容沒什麼別的意義,就是扮演佔位符的作用,主要是因為HotSpot虛擬機的記憶體管理要求物件的大小必須是8位元組的整數倍,而物件頭剛好是8個位元組的整數倍,但是實例資料不一定,所以需要對齊填充補全。
作者:yes的練等攻略
連結:https://juejin.cn/post/6844903827427033096
來源:掘金
相關推薦:java面試題目及答案
以上是介紹一下java物件的組成的詳細內容。更多資訊請關注PHP中文網其他相關文章!