1. 程式人生 > >JVM學習之物件的管理

JVM學習之物件的管理

概述:

本文主要講述了JAVA中物件建立、訪問、及其記憶體佈局。

物件的建立:

1.記憶體分配:
物件建立首先要申請記憶體,在JVM中有兩種記憶體管理的辦法:指標碰撞與空閒列表。如果JVM的垃圾回收機制中,能夠自動的整理物件,將物件緊密聯絡的排列在記憶體中,記憶體管理就可以使用指標碰撞的辦法,系統維護了一個指標,指向記憶體中最靠近未被使用的記憶體的物件結束位置。由於物件是緊密排列的,那麼我們就可以明白這個指標以上的記憶體都被使用了,所以只需要將指標下移新物件的大小,就完成了記憶體分配的過程。空閒列表是維護一個列表,記錄著可用的記憶體塊,在分配記憶體時只需要將找到滿足新物件大小的記憶體塊即可。
2.物件頭的設定:
分配好記憶體後,就需要設定這個物件的頭部資訊:物件頭包含了物件是哪個類的例項,物件的雜湊碼,物件的GC分代年齡等資訊,物件的鎖狀態不同,頭部資訊各不相同。
3.建構函式的呼叫:
在執行完物件頭的設定後,物件在JVM眼裡已經完成建立了,剩下的工作就是呼叫建構函式,初始化物件的資料欄位。

物件的結構:

物件包含物件頭,例項資料,Padding三塊資訊。
先從物件頭開始介紹,物件頭包括兩個部分,第一個部分是記錄了物件執行時的資料,例如雜湊碼,GC分代年齡,鎖狀態標誌、執行緒持有的鎖、偏向執行緒ID、偏向時間戳等。這部分資料在32位與64位虛擬機器中分別為32bit與64bit。
這段資料根據執行緒鎖狀態的不同,含義各不相同,具體見下表

———- ———– ———
儲存內容 標誌位 狀態

———-
物件雜湊碼、分代年齡 01 未鎖定
指向鎖記錄的指標 00 輕量級鎖定
指向重量級鎖定的指標 10 重量級鎖定
空 11 GC標記
偏向執行緒ID、偏向時間戳、分代年齡 01 可偏向

———-
另一部分是物件累的元資料,儲存了一個指向型別資料的指標,表示這個物件是哪個類的物件。

物件的定位:

兩種方法,一種通過控制代碼,另一種通過直接指標。