java 虛擬機(jī)中對(duì)象訪問(wèn)詳解
java 虛擬機(jī)中對(duì)象訪問(wèn)詳解
對(duì)象訪問(wèn)會(huì)涉及到Java棧、Java堆、方法區(qū)這三個(gè)內(nèi)存區(qū)域。
如下面這句代碼:
Object objectRef = new Object();
假設(shè)這句代碼出現(xiàn)在方法體中,"Object objectRef” 這部分將會(huì)反映到Java棧的本地變量中,作為一個(gè)reference類(lèi)型數(shù)據(jù)出現(xiàn)。而“new Object()”這部分將會(huì)反映到Java堆中,形成一塊存儲(chǔ)Object類(lèi)型所有實(shí)例數(shù)據(jù)值的結(jié)構(gòu)化內(nèi)存,根據(jù)具體類(lèi)型以及虛擬機(jī)實(shí)現(xiàn)的對(duì)象內(nèi)存布局的不同,這塊內(nèi)存的長(zhǎng)度是不固定。另外,在java堆中還必須包括能查找到此對(duì)象類(lèi)型數(shù)據(jù)(如對(duì)象類(lèi)型、父類(lèi)、實(shí)現(xiàn)的接口、方法等)的地址信息,這些數(shù)據(jù)類(lèi)型存儲(chǔ)在方法區(qū)中。
reference類(lèi)型在java虛擬機(jī)規(guī)范里面只規(guī)定了一個(gè)指向?qū)ο蟮囊玫刂?,并沒(méi)有定義這個(gè)引用應(yīng)該通過(guò)那種方式去定位,訪問(wèn)到j(luò)ava堆中的對(duì)象位置,因此不同的虛擬機(jī)實(shí)現(xiàn)的訪問(wèn)方式可能不同,主流的方式有兩種:使用句柄和直接指針。
句柄訪問(wèn)方式:java堆中將劃分出一塊內(nèi)存來(lái)作為句柄池,reference中存儲(chǔ)的就是對(duì)象的句柄地址,而句柄中包含了對(duì)象實(shí)例數(shù)據(jù)和類(lèi)型數(shù)據(jù)各自的具體地址信息。
指針訪問(wèn)方式:reference變量中直接存儲(chǔ)的就是對(duì)象的地址,而java堆對(duì)象一部分存儲(chǔ)了對(duì)象實(shí)例數(shù)據(jù),另外一部分存儲(chǔ)了對(duì)象類(lèi)型數(shù)據(jù)。
這兩種訪問(wèn)對(duì)象的方式各有優(yōu)勢(shì),使用句柄訪問(wèn)方式最大好處就是reference中存儲(chǔ)的是穩(wěn)定的句柄地址,在對(duì)象移動(dòng)時(shí)只需要改變句柄中的實(shí)例數(shù)據(jù)指針,而reference不需要改變。使用指針訪問(wèn)方式最大好處就是速度快,它節(jié)省了一次指針定位的時(shí)間開(kāi)銷(xiāo),就虛擬機(jī)而言,它使用的是第二種方式(直接指針訪問(wèn))。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Spring JPA配置文件Eclipse報(bào)錯(cuò)如何解決
這篇文章主要介紹了Spring JPA配置文件Eclipse報(bào)錯(cuò)如何解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10java判斷integer是否為空的詳細(xì)過(guò)程
在java編寫(xiě)過(guò)程中,我們會(huì)使用到各種各樣的表達(dá)式,在使用表達(dá)式的過(guò)程中,有哪些安全問(wèn)題需要我們注意的呢?對(duì)java判斷integer是否為空相關(guān)知識(shí)感興趣的朋友一起來(lái)看看吧2023-02-02Springboot如何獲取yml、properties參數(shù)
這篇文章主要介紹了Springboot如何獲取yml、properties參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03簡(jiǎn)單易用的Spring?Boot郵件發(fā)送demo
本文將介紹如何使用Spring?Boot發(fā)送郵件,我們將演示如何配置SMTP郵件服務(wù)器,創(chuàng)建一個(gè)郵件模板,以及如何使用JavaMailSender發(fā)送郵件,我們還將介紹如何測(cè)試我們的郵件發(fā)送代碼2023-12-12