對象在堆上創(chuàng)建商源。
對象的創(chuàng)建包括以下幾步:
1 分配內(nèi)存?。包括兩種方式,指針碰撞(Bump the Point )栈戳,空閑列表(Free List)。如果 虛擬機自己支持 壓縮內(nèi)存的話难裆,分配方式是 指針碰撞子檀。為了保證線程安全镊掖,先預(yù)先給線程分配空間。稱為TLAB(Thread local Allocation Buffer)褂痰。
2 初始化為零值(便于Java代碼中不賦予初始值就可以使用)
3虛擬機設(shè)置對象頭給對象(元數(shù)據(jù)亩进,對象的哈希碼,分配的GC年齡)
4執(zhí)行方法缩歪。
對象在內(nèi)存中的布局分布
1 對象頭归薛。存jvm需要的對象的信息。
2 實例數(shù)據(jù)匪蝙。就是代碼產(chǎn)生象信息主籍。
3 占位符。jvm 要求起始地址必須是8的整數(shù)倍逛球。
對象的訪問定位
1 句柄訪問千元。 reference 到 句柄 到 對象。 句柄里放對象地址颤绕。
2 直接訪問幸海。 reference 到 對象。
句柄奥务,如果對象地址改動物独,不用更改reference 的值,只改變句柄里的值氯葬。這里 改變句柄里的代價 肯定要遠(yuǎn)小于改變reference的代價议纯。不然沒必要。