JVM學習之物件的管理
阿新 • • 發佈:2019-01-28
概述:
本文主要講述了JAVA中物件建立、訪問、及其記憶體佈局。
物件的建立:
1.記憶體分配: 物件建立首先要申請記憶體,在JVM中有兩種記憶體管理的辦法:指標碰撞與空閒列表。如果JVM的垃圾回收機制中,能夠自動的整理物件,將物件緊密聯絡的排列在記憶體中,記憶體管理就可以使用指標碰撞的辦法,系統維護了一個指標,指向記憶體中最靠近未被使用的記憶體的物件結束位置。由於物件是緊密排列的,那麼我們就可以明白這個指標以上的記憶體都被使用了,所以只需要將指標下移新物件的大小,就完成了記憶體分配的過程。空閒列表是維護一個列表,記錄著可用的記憶體塊,在分配記憶體時只需要將找到滿足新物件大小的記憶體塊即可。 2.物件頭的設定: 分配好記憶體後,就需要設定這個物件的頭部資訊:物件頭包含了物件是哪個類的例項,物件的雜湊碼,物件的GC分代年齡等資訊,物件的鎖狀態不同,頭部資訊各不相同。 3.建構函式的呼叫: 在執行完物件頭的設定後,物件在JVM眼裡已經完成建立了,剩下的工作就是呼叫建構函式,初始化物件的資料欄位。
物件的結構:
物件包含物件頭,例項資料,Padding三塊資訊。
先從物件頭開始介紹,物件頭包括兩個部分,第一個部分是記錄了物件執行時的資料,例如雜湊碼,GC分代年齡,鎖狀態標誌、執行緒持有的鎖、偏向執行緒ID、偏向時間戳等。這部分資料在32位與64位虛擬機器中分別為32bit與64bit。
這段資料根據執行緒鎖狀態的不同,含義各不相同,具體見下表
———- ———– ———
儲存內容 標誌位 狀態
———-
物件雜湊碼、分代年齡 01 未鎖定
指向鎖記錄的指標 00 輕量級鎖定
指向重量級鎖定的指標 10 重量級鎖定
空 11 GC標記
偏向執行緒ID、偏向時間戳、分代年齡 01 可偏向
———-
另一部分是物件累的元資料,儲存了一個指向型別資料的指標,表示這個物件是哪個類的物件。
物件的定位:
兩種方法,一種通過控制代碼,另一種通過直接指標。