new 了一個(gè)object 發(fā)生了什么?
Object o = new Obejct();
簡單的new一個(gè)對象也會設(shè)計(jì)到3個(gè)區(qū)域的關(guān)聯(lián)關(guān)系: java棧乐埠,java堆抗斤,方法區(qū)
大概流程:Object o 會存放到棧中的局部變量表中,它的引用reference 會是堆中的內(nèi)存地址丈咐,new Object() 會在堆中創(chuàng)建一個(gè)存放object的結(jié)構(gòu)化內(nèi)存瑞眼,此外堆中還會存放該對象的類型數(shù)據(jù)在方法區(qū)的地址信息(對象類型,父類棵逊,實(shí)現(xiàn)的接口伤疙,方法等),而方法區(qū)存放的為堆中引用地址的具體數(shù)據(jù)信息辆影;
兩種對象訪問方式結(jié)構(gòu)圖:
虛擬機(jī)規(guī)范只是定義了reference對象指向?qū)ο蟮囊猛较瘢]有規(guī)范具體怎么去引用,主流引用方式有兩種蛙讥,句柄訪問和直接指針訪問锯蛀;
句柄訪問原理:reference 對象存放的是對象的句柄池池地址,而句柄中存放的是對象的類型指針(方法區(qū)中的類型數(shù)據(jù))和對象實(shí)例的指針
直接指針訪問原理:reference 對象存放的是對象的在堆中的地址次慢;
兩種的利與弊:
句柄:reference對象引用的句柄地址旁涤,當(dāng)對象被移動時(shí),只是修改句柄池到對象實(shí)例數(shù)據(jù)的指針迫像,而不會修改reference對句柄池的指針劈愚;
直接指針:直接指針的優(yōu)點(diǎn)就是快,節(jié)省了一步句柄指針定位的時(shí)間闻妓,java對象訪問非常頻繁菌羽,也會省去不小的一份開銷;
hotspot使用的為直接指針訪問纷闺;