9.物件的例項化、記憶體分配與訪問定位
阿新 • • 發佈:2021-07-08
一、物件的例項化
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.屬性的顯示初始化、程式碼塊中的初始化、構造器中的初始化
二、物件的記憶體佈局
...
三、物件的訪問定位
控制代碼訪問
開闢 一塊 控制代碼池表 記憶體