1.類加載檢查:虛擬機遇到一條new指令時,首先將去檢查這個指令的參數是否能在常量池定位到這個類的符號引用,並且檢查這個符號引用代表的類是否已被加載過、解析過和初始化過,如果沒有,則進行相應的類加載過程。
2.分配內存:在類加載檢查通過后,接下來虛擬機將為新生對象分配內存。對象所需的內存大小在類加載完成后便可確定,為對象分配空間的任務等同於把一塊確定大小的內存從Java堆中划分出來。分配方式有“指針碰撞”和“空閑列表”兩種方式。
3.初始化零值:內存分配完成后,虛擬機需要將分配到的內存空間都初始化為零值(不包括對象頭),這一步操作保證了對象的實例字段在 Java 代碼中可以不賦初始值就直接使用,程序能訪問到這些字段的數據類型所對應的零值。
4.設置對象頭:初始化零值完成之后,虛擬機要對對象進行必要的設置,例如這個對象是那個類的實例、如何才能找到類的元數據信息、對象的哈希嗎、對象的 GC 分代年齡等信息。 這些信息存放在對象頭中。 另外,根據虛擬機當前運行狀態的不同,如是否啟用偏向鎖等,對象頭會有不同的設置方式。
5.執行init方法:在上面工作都完成之后,從虛擬機的視角來看,一個新的對象已經產生了,但從 Java 程序的視角來看,對象創建才剛開始,
PS:部分內容來自網絡搬運,如涉及侵權請聯系刪除或增加標識,感謝!