對象的建立
Step1:類加載檢查
虛拟機遇到一條new指令時,首先将去檢查這個指令的參數是否能在常量池中定位到這個類的符号引用,并且檢查這個符号引用代表的類是否已被加載、解析和初始化過。如果沒有,那必須先執行想用的類加載過程。
Step2:配置設定記憶體
在類加載檢查通過後,接下來虛拟機将為新生對象配置設定記憶體。對象所需的記憶體大小在類加載完成後便可确定,為對象配置設定空間的任務等同于把一塊确定大小的記憶體從Java堆中劃分出來。配置設定方式有“指針碰撞”和“空閑清單”兩種,選擇哪種配置設定方式由Java堆是否規整決定,而Java堆是否規整又由所采用的垃圾收集器是否帶有壓縮整理功能決定。
Step3:初始化零值
記憶體配置設定完成後,虛拟機需要将配置設定到的記憶體空間都初始化為零值,這一步操作保證了對象的執行個體字段在Java代碼中可以不賦初始值就直接使用,程式能通路到這些字段的資料類型所對應的零值。
Step4:設定對象頭
初始化零值完成之後,虛拟機要對對象進行必要的設定,例如這個對象是哪個類的執行個體,如何才能找到類的中繼資料資訊、對象的哈希碼、對象的GC分代年齡等資訊。這些資訊存放在對象頭中。另外,根據虛拟機目前狀态的不同,如是否啟用偏向鎖等,對象頭會有不同的設定方式。
Step5:執行init方法
在上面工作都完成之後,從虛拟機的視角來看,一個新的對象已經産生了,但從Java程式的視角來看,對象的建立才剛開始,init方法還沒有執行,所有的字段都還為零。是以一般來說,執行new指令之後會接着執行init方法,把對象按照程式員的意願進行初始化,這樣一個真正可用的對象才算完全産生出來。