1. 程式人生 > >3、物件記憶體佈局 物件訪問定位

3、物件記憶體佈局 物件訪問定位

物件佈局

* 物件頭 (兩個部分)    
		* 執行時資料:雜湊碼,GC分代年齡,鎖狀態標誌,執行緒持有鎖,偏向執行緒ID,偏向時間戳等
		* 型別指標:指向本類。。確定 是那個類的例項。但是查詢(查詢物件的元資料資訊不一定經過物件本身)。
		* 如果物件是java陣列,物件頭還有記錄陣列長度的資料。
* 例項資料
		* 物件真正的資料,資料為程式所設定的資料,父類繼承下來的,子類本身的資料都會寫到物件記憶體中
		* 儲存順序受到虛擬機器分配策略引數(相同長度分配到一起)和java原始碼定義順序影響
		* CompactFields引數true(預設false)時子類變數會插入到父類變數空隙中
* 對齊填充
		* 佔位符作用,HotSpotVM要求物件起始地址必須為8的整數倍

物件訪問定位 1、控制代碼模式訪問 2、直接指標訪問 兩種訪問模式比較: 控制代碼模式:reference->控制代碼->物件例項資料(控制代碼地址不改變,所以reference不改變)控制代碼指向的地址(即儲存的資料)會跟著物件移動而跟著移動。(垃圾收集時物件是一直在移動的)(軟體開發來看:各種語言和框架使用控制代碼訪問情況十分常見) 直接模式:reference->物件例項資料 好處:速度快,減少一次指標定位時間開銷,(物件訪問非常頻繁)

控制代碼是什麼:控制代碼是一個識別符號,標識物件或專案。 簡單來說:我的座位是10號,我換座位到20號了,但是座位表上還是10號就錯了,(倘若訂餐送到座位號上)必須將座位號也跟著改為20.這就是控制代碼 以下引用百度百科一段:

https://baike.baidu.com/item/控制代碼/3527587?fr=aladdin Windows是一個以虛擬記憶體為基礎的作業系統。在這種系統環境下,Windows記憶體管理器經常在記憶體中來回移動物件,以此來滿足各種應用程式的記憶體需要。物件被移動意味著它的地址變化了。如果地址總是如此變化,我們該到哪裡去找那一個物件呢?為了解決這個問題,Windows作業系統為全體應用程式騰出一些記憶體單元,用來專門登記各應用程式的物件在記憶體中的地址的變化,而前者的實體地址在系統執行期間是始終保持不變的。Windows記憶體管理器移動了物件在記憶體中的位置後,會把該物件新的地址及時地告知給對應的控制代碼進行更新。這樣我們只要知道這個控制代碼,就可以間接地知道物件具體在記憶體中的哪個位置了。這個地址是在物件裝載(Load)時由系統分配給的,當物件解除安裝時(Unload)又釋放給系統。