對象的創建和訪問

一、對象的組成:

JVM堆上的對象主要由三部分組成:對象頭、對象實例數據和對齊填充。

對象頭:對象頭主要由兩部分組成,對象運行時的數據和指向對象所屬類信息的指針。數組對象還包含一個數組長度信息。

對象運行時的數據主要包含對象的hashcode 25b,GC 分代年齡4位,鎖狀態標誌,線程持有的鎖,偏向線程ID,偏向線程時間戳等。

通過句柄訪問對象指向對象所屬類信息的指針爲空。

對象的實例數據是指類生命的實例變量部分。

因爲Hotspot虛擬機堆的基本單位是字節,所以要求對象的大小是8的倍數。因此需要對其填充

二、對象的創建:

當虛擬機遇到一條new指令時,回首先判斷該指令操作的符號引用所表示的類有沒有加載到內存中,沒有則首先進行類的加載、驗證、準備、解析、初始化過程,然後檢查該類的訪問權限,在檢查通過後,則需要在堆上劃分一塊區域供該對象使用,若堆是乾淨整潔的,已使用的在一端,未使用的在另一端,則使用指針碰撞的方式爲對象分配一塊區域,否則,虛擬機將維護一張表叫”空閒列表“,檢查表中是否有足夠大的條目供對象使用。具體使用哪種方式跟具體的垃圾收集算法有關。爲了保持在併發環境下的安全,JVM採用CAS+重試的方式進行對象分配,爲了提高分配的效率,JVM在創建線程時會預先分配一塊較小的內存共線程使用,稱爲本地線程分配緩存(TLAB)。內存分配完畢後,會對該內存進行初始化操作(清零)。

三、對象的訪問:

JVM訪問對象的方式主要有兩種:句柄訪問和直接引用。

句柄訪問:虛擬機在堆中維護一個句柄列表,句柄中主要包含兩部分:類的元數據對象地址和類的實例對象地址。每次訪問一個對象時,先訪問該對象的句柄,再通過句柄訪問對象在堆上的實例。這樣帶來的好處就是引用類型的值是穩定的,假如對象發生了變化,只需要在句柄中修改即可。

1

直接引用:JVM直接訪問對象在堆上的實例地址,再通過堆上的實例中的對象頭訪問對象的元數據信息。相比句柄訪問的好處引用指向的就是對象的實際位置,無需再次訪問。

2

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章