一:說說對象創建過程?

一、虛擬機遇到一條new指令時,首先將去檢查這個指令的參數是否能在常量池中定位到一個類的符號引用,並且檢查這個符號引用代表的類是否已被加載、解析和初始化過(如果沒有,那必須先執行相應的類加載過程)

二、類加載檢查通過後,接下來虛擬機將爲新生對象分配內存。對象所需內存的大小在類加載完成後便可完全確定,爲對象分配空間的任務等同於把一塊確定大小的內存從Java堆中劃分出來。

附: 虛擬機是如何爲對象分配內存空間的?

三、內存分配完成後,虛擬機需要將分配到的內存空間都初始化爲零值(不包括對象頭), 如果使用TLAB,這一工作過程也可以提前至TLAB分配時進行。這一步操作保證了對象的實

 

例字段在Java代碼中可以不賦初始值就直接使用,程序能訪問到這些字段的數據類型所對應的零值。

四、虛擬機要對對象進行必要的設置,例如這個對象是哪個類的實例、如何才能找到類的元數據信息、對象的哈希碼、對象的GC分代年齡等信息。這些信息存放在對象的對象頭(Object Header)之中。根據虛擬機當前的運行狀態的不同,如是否啓用偏向鎖等,對象頭會有不同的設置方式。


在上面工作都完成之後,從虛擬機的視角來看,一個新的對象已經產生了,但從Java程序的視角來看,對象創建纔剛剛開始——<init>方法還沒有執行,所有的字段都還爲零。所以,一般來說(由字節碼中是否跟隨invokespecial指令所決定),執行new指令之後會接着執行<init>方法,把對象按照程序員的意願進行初始化,這樣一個真正可用的對象纔算完全產生出來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章