1. 程式人生 > 其它 >9.物件的例項化、記憶體分配與訪問定位

9.物件的例項化、記憶體分配與訪問定位

一、物件的例項化

1.判斷物件所屬於的類是否被載入、連結、初始化

		虛擬機器需要一條new 指令後,首先去檢測這個指令的引數能否在Metaspace的常量池中
		定位到一個類的的符號引用,並且去檢測這個符號引用代表的類是否被載入、連結、初始化(即判斷類元資訊是否存在)。
		如果沒有,則在雙親委派機制下,使用當前類的載入器以ClassLoader+包名+類名為key進行查詢對應的.class檔案。
		如果沒有找到此檔案,則丟擲ClassNotFoundEx異常,如果找到,則載入,生成類的物件

2. 為物件分配記憶體

		如果記憶體規整,則發生指標碰撞,挨個位置找,找到空閒位置,插入。
		如果記憶體不規整,虛擬機器需要維護一個列表(Free List),記錄著哪塊記憶體沒有被用到,
		然後找到一塊足夠大的記憶體,放進去,更新這個 空閒列表(Free Lsit)

3.處理併發安全問題

		1.採用CAS(對比和交換)失敗重試、區域加鎖、保證更新的原子性
		2.每個執行緒預先分配TLAB塊(私有塊兒,避免併發)。

4.初始化分配到的空間

		1.屬性的預設初始化
		2.顯示初始化
		3.程式碼塊的初始化
		4.構造器當中初始化

5.設定物件頭

		將物件的所屬的類(即類的類元資訊)、物件的HashCode和物件的GC資訊、鎖資訊等儲存
		在物件的物件頭中,這個過程具體實現方式 取決於JVM實現

6.執行init方法進行初始化

		略...

對上述總結:

		1.載入類元資訊
		2.為物件分配記憶體
		3.處理併發問題
		4.屬性的預設初始化
		5.設定物件頭資訊
		6.屬性的顯示初始化、程式碼塊中的初始化、構造器中的初始化

二、物件的記憶體佈局

...

三、物件的訪問定位

控制代碼訪問

	開闢 一塊 控制代碼池表 記憶體

直接指標 指向(咱們用的)

相比 控制代碼訪問比直接指標 多了一個 中介軟體

四、面試題