在JVM中對象的創(chuàng)建,我們從一個new指令開始:
這個過程大概圖示如下:
虛擬機收到new指令觸發(fā)。
類加載檢查:如果類沒有被類加載器加載,則執(zhí)行類加載流程(將class信息加載到JVM的運行時數(shù)據(jù)區(qū)的過程),對象所需內(nèi)存大小在類加載完后可以完全確定。
對象分配內(nèi)存:從堆中劃分出一塊確定大小的內(nèi)存。
內(nèi)存空間初始化:內(nèi)存分配完后,虛擬機需要將分配到的內(nèi)存空間初始化為零值(如:int值為0,boolean值為false等),保證了對象的實例字段在Java代碼中可以直接使用。
為對象進(jìn)行必要的設(shè)置:虛擬機為對象進(jìn)行設(shè)置,如設(shè)置對象屬于哪個類的實例、如何找到類的元數(shù)據(jù)信息、對象的哈希碼、對象的GC分代年齡等信息,這些信息存放在對象頭中。
從虛擬機的角度來看,一個新的對象已經(jīng)創(chuàng)建完畢。但從Java程序的角度來看,對象創(chuàng)建才剛開始,所有的字段還是零值,所以需要程序員進(jìn)行初始化操作,這樣一個真正可用的對象才算完全產(chǎn)生出來。
init是對對象級別的變量或非靜態(tài)代碼塊進(jìn)行初始化的文章來源:http://www.zghlxwxcb.cn/news/detail-842496.html
clinit靜態(tài)變量或者靜態(tài)代碼塊誰來初始化呢文章來源地址http://www.zghlxwxcb.cn/news/detail-842496.html
到了這里,關(guān)于JVM中對象創(chuàng)建過程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!