亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

從匯編碼分析java對象的創(chuàng)建過程(推薦)

 更新時(shí)間:2020年03月31日 14:29:19   作者:LU_ZHAO  
這篇文章主要介紹了從匯編碼分析java對象的創(chuàng)建過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

源碼:

class T {
	int m = 8;
}
T t = new T();

匯編碼:

0 new #2 <T>
3 dup
4 invokespecial #3 <T.<init>>
7 astore_1
8 return

new #2

申請內(nèi)存,在堆里面創(chuàng)建一個新對象。

半初始化,新建對象中的m值是0。

dup

復(fù)制操作,因?yàn)閕nvokespecial會消耗一份引用,所以先復(fù)制一份

invokespecial

4 invokespecial #3 <T.>

init是調(diào)用它的構(gòu)造方法。

此時(shí)對象中的m值是8。

astore_1

將符號和對象建立關(guān)聯(lián),即t和堆中的對象。

其實(shí)很簡單,今天看一個視頻說了半天。。。

知識點(diǎn)補(bǔ)充:java對象的創(chuàng)建過程

大家都知道,java使用new 關(guān)鍵字進(jìn)行對象的創(chuàng)建,但這只是從語言層次上理解了對象的創(chuàng)建,下邊我們從jvm的角度來看看,對象是怎么被創(chuàng)建出來的,即對象的創(chuàng)建過程。

對象的創(chuàng)建大概分為以下幾步:

1:檢查類是否已經(jīng)被加載;

2:為對象分配內(nèi)存空間;

3:為對象字段設(shè)置零值;

4:設(shè)置對象頭;

5:執(zhí)行構(gòu)造方法。

第一步,當(dāng)程序遇到new 關(guān)鍵字時(shí),首先會去運(yùn)行時(shí)常量池中查找該引用所指向的類有沒有被虛擬機(jī)加載,如果沒有被加載,那么會進(jìn)行類的加載過程,如果已經(jīng)被加載,那么進(jìn)行下一步,為對象分配內(nèi)存空間;

第二步,加載完類之后,需要在堆內(nèi)存中為該對象分配一定的空間,該空間的大小在類加載完成時(shí)就已經(jīng)確定下來了,這里多說一點(diǎn),為對象分配內(nèi)存空間有兩種方式:

(1)第一種是jvm將堆區(qū)抽象為兩塊區(qū)域,一塊是已經(jīng)被其他對象占用的區(qū)域,另一塊是空白區(qū)域,中間通過一個指針進(jìn)行標(biāo)注,這時(shí)只需要將指針向空白區(qū)域移動相應(yīng)大小空間,就完成了內(nèi)存的分配,當(dāng)然這種劃分的方式要求虛擬機(jī)的對內(nèi)存是地址連續(xù)的,且虛擬機(jī)帶有內(nèi)存壓縮機(jī)制,可以在內(nèi)存分配完成時(shí)壓縮內(nèi)存,形成連續(xù)地址空間,這種分配內(nèi)存方式成為“指針碰撞”,但是很明顯,這種方式也存在一個比較嚴(yán)重的問題,那就是多線程創(chuàng)建對象時(shí),會導(dǎo)致指針劃分不一致的問題,例如A線程剛剛將指針移動到新位置,但是B線程之前讀取到的是指針之前的位置,這樣劃分內(nèi)存時(shí)就出現(xiàn)不一致的問題,解決這種問題,虛擬機(jī)采用了循環(huán)CAS操作來保證內(nèi)存的正確劃分;

(2)第二種也是為了解決第一種分配方式的不足而創(chuàng)建的方式,多線程分配內(nèi)存時(shí),虛擬機(jī)為每個線程分配了不同的空間,這樣每個線程在分配內(nèi)存時(shí)只是在自己的空間中操作,從而避免了上述問題,不需要同步。當(dāng)然,當(dāng)線程自己的空間用完了才需要需申請空間,這時(shí)候需要進(jìn)行同步鎖定。為每個線程分配的空間稱為“本地線程分配緩沖(TLAB)”,是否啟用TLAB需要通過 -XX:+/-UseTLAB參數(shù)來設(shè)定。

第三步,分配完內(nèi)存后,需要對對象的字段進(jìn)行零值初始化,對象頭除外,零值初始化意思就是對對象的字段賦0值,或者null值,這也就解釋了為什么這些字段在不需要進(jìn)程初始化時(shí)候就能直接使用;

第四步,這里,虛擬機(jī)需要對這個將要創(chuàng)建出來的對象,進(jìn)行信息標(biāo)記,包括是否為新生代/老年代,對象的哈希碼,元數(shù)據(jù)信息,這些標(biāo)記存放在對象頭信息中,對象頭非常復(fù)雜,這里不作解釋,可以另行百度;

第五步,也就是最后一步,執(zhí)行對象的構(gòu)造方法,這里做的操作才是程序員真正想做的操作,例如初始化其他對象啊等等操作,至此,對象創(chuàng)建成功。

這里其實(shí)講的比較粗淺,只是對象創(chuàng)建的大概過程,例如對象頭、類的加載等等都是非常復(fù)雜的過程,我會在接下來解釋。

總結(jié)

到此這篇關(guān)于從匯編碼分析java對象的創(chuàng)建過程的文章就介紹到這了,更多相關(guān)從匯編碼分析java對象的創(chuàng)建過程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實(shí)現(xiàn)按層遍歷二叉樹

    java實(shí)現(xiàn)按層遍歷二叉樹

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)按層遍歷二叉樹,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Java的枚舉,注解和反射(一)

    Java的枚舉,注解和反射(一)

    今天小編就為大家分享一篇關(guān)于Java枚舉,注解與反射原理說明,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2021-07-07
  • Oracle+Mybatis的foreach insert批量插入報(bào)錯的快速解決辦法

    Oracle+Mybatis的foreach insert批量插入報(bào)錯的快速解決辦法

    本文給大家介紹Oracle+Mybatis的foreach insert批量插入報(bào)錯的快速解決辦法,非常不錯,具有參考借鑒價(jià)值,感興趣的朋友參考下吧
    2016-08-08
  • 淺談springboot中tk.mapper代碼生成器的用法說明

    淺談springboot中tk.mapper代碼生成器的用法說明

    這篇文章主要介紹了淺談springboot中tk.mapper代碼生成器的用法說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 詳解spring boot配置 ssl

    詳解spring boot配置 ssl

    本篇文章主要介紹了詳解spring boot配置 ssl,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Springboot之restTemplate的配置及使用方式

    Springboot之restTemplate的配置及使用方式

    這篇文章主要介紹了Springboot之restTemplate的配置及使用方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 淺談Java8 判空新寫法

    淺談Java8 判空新寫法

    在開發(fā)過程中很多時(shí)候會遇到判空校驗(yàn),如果不做判空校驗(yàn)則會產(chǎn)生NullPointerException異常,本文就來介紹一下Java8 判空新寫法,感興趣的可以了解一下
    2021-09-09
  • SpringBoot中使用攔截器的配置詳解

    SpringBoot中使用攔截器的配置詳解

    這篇文章主要介紹了SpringBoot中使用攔截器的配置詳解,攔截器是?AOP?的一種實(shí)現(xiàn),專門攔截對動態(tài)資源的后臺請求,即攔截對控制層的請?求,使用場景比較多的是判斷用戶是否有權(quán)限請求后臺,需要的朋友可以參考下
    2024-01-01
  • 將15位身份證補(bǔ)全為18位身份證的算法示例詳解

    將15位身份證補(bǔ)全為18位身份證的算法示例詳解

    這篇文章主要給大家介紹了關(guān)于將15位身份證補(bǔ)全為18位身份證算法的相關(guān)資料,文中通過示例代碼給大家介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-06-06
  • SpringBoot之QueryDsl嵌套子查詢問題

    SpringBoot之QueryDsl嵌套子查詢問題

    這篇文章主要介紹了SpringBoot之QueryDsl嵌套子查詢問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評論