1. 判斷對象對應的類是否被加載,鏈接,初始化
虛擬機遇到一條new 指令,首先求檢查這個和這個符號引用代表的類是否被加載,鏈接和初始化,即:判斷類元信息是否存在)。如果沒有,那么雙親委派機制模式下,使用當前類加載器以ClassLoader+包名+類名為key進行查找對應的.class文件。如果,沒有查找到文件,則拋出ClassNotFoundException異常,如果找到,則加載,並生成對應的Class對象。
2. 為對象分配內存
計算對象占用內存的大小(引用類型4個字節),接着在堆中划分一塊內存給新對象
- 如果內存完整----指針碰撞
- 如果內存不完整----空閑列表分配(在K線列表找足夠的內存)
3. 處理並發問題
- 采用CAS失敗重試,區域加鎖保證更新原子性
- TLAB(線程本地緩存區)
4. 初始化分配到的空間,即:默認初始化,保證對象在不賦值時可以直接使用
5. 設置對象的對象頭(將對象的類信息(指向方法區),hashCode,GC信息,鎖信息等他數據存儲在對象頭中)
6. 執行init方法進行初始化