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

Java對(duì)象存儲(chǔ)內(nèi)存布局詳解

 更新時(shí)間:2023年04月28日 10:37:40   作者:在下uptown  
眾所周知,Java是一門(mén)面向?qū)ο蟮恼Z(yǔ)言,那么一個(gè)對(duì)象在內(nèi)存中都包含什么東西呢,本文主要詳細(xì)介紹了Java對(duì)象的內(nèi)存布局,訪問(wèn)定位,創(chuàng)建過(guò)程,線(xiàn)程安全,感興趣的小伙伴可以跟著小編一起來(lái)學(xué)習(xí)

Java對(duì)象存儲(chǔ)內(nèi)存布局

眾所周知,Java是一門(mén)面向?qū)ο蟮恼Z(yǔ)言,那么一個(gè)對(duì)象在內(nèi)存中都包含什么東西呢,首先,對(duì)象大部分是存儲(chǔ)在堆上的(逃逸除外 )。

那么對(duì)象存儲(chǔ)在堆中主要分為三個(gè)部分

  • 對(duì)象頭、對(duì)象實(shí)例數(shù)據(jù)、對(duì)齊補(bǔ)充(數(shù)組會(huì)多一個(gè)數(shù)組長(zhǎng)度)
  • 對(duì)象頭:

    mark word: 存儲(chǔ)對(duì)象的hashCode、鎖信息(鎖升級(jí))或分代年齡或GC標(biāo)志等信息

    類(lèi)型指針: 存儲(chǔ)指向?qū)ο笏鶎兕?lèi)(元數(shù)據(jù)中class文件)的指針,JVM通過(guò)這個(gè)確定這個(gè)對(duì)象屬于哪個(gè)類(lèi)

  • 對(duì)象實(shí)例數(shù)據(jù):

    new出的對(duì)象信息,存放類(lèi)的屬性數(shù)據(jù)信息,包括父類(lèi)的屬性信息;

  • 對(duì)齊補(bǔ)充

    數(shù)組對(duì)象會(huì)多對(duì)齊填充

    JVM要求對(duì)象占用的空間必須是8 的倍數(shù),方便內(nèi)存分配(以字節(jié)為最小單位分配),因此這部分就是用于填滿(mǎn)不夠的空間湊數(shù)用的。

Java對(duì)象的訪問(wèn)定位

  • 主流的訪問(wèn)方式主要有句柄直接指針
  • 句柄

    Java堆中劃分出一塊內(nèi)存作為句柄池,棧中的reference中存儲(chǔ)的事對(duì)象的句柄地址,而句柄中包含了對(duì)象實(shí)例數(shù)據(jù)與類(lèi)型數(shù)據(jù)各自具體的地址信息

  • 直接指針

    java堆中對(duì)象的內(nèi)存布局必須考慮如何防止訪問(wèn)類(lèi)型數(shù)據(jù)的相關(guān)信息,reference中存儲(chǔ)的直接是對(duì)象地址。

  • 直接指針訪問(wèn)對(duì)象不需要多一次間接訪問(wèn)開(kāi)銷(xiāo),而句柄方便在對(duì)象地址發(fā)生改變時(shí)(垃圾回收會(huì)移動(dòng)對(duì)象地址)只需要改變句柄中的指針引用本身不需要改變。

**
**

Java對(duì)象的創(chuàng)建過(guò)程

  • 虛擬機(jī)遇到new指令時(shí),先去檢查指定的類(lèi)是否被加載、驗(yàn)證、準(zhǔn)備為類(lèi)中的所有靜態(tài)變量分配內(nèi)存空間,并為其設(shè)置一個(gè)初始值 、解析、初始化過(guò)。

  • 類(lèi)檢查后虛擬機(jī)為新對(duì)象分配內(nèi)存

    如何保證并發(fā)情況分配堆內(nèi)存安全

    虛擬機(jī)采用CAS配上失敗重試保證原子性

    把內(nèi)存分配交給線(xiàn)程,在創(chuàng)建線(xiàn)程時(shí)分配空間,把分配內(nèi)存的任務(wù)交給線(xiàn)程支配。通過(guò)TLAB(Thread local Allocation Buffer)開(kāi)啟

  • 分配完內(nèi)存后設(shè)置對(duì)象頭,如哪個(gè)類(lèi)的實(shí)例、hashcode、類(lèi)的元數(shù)據(jù)信息指針(方法區(qū))

  • 執(zhí)? init ?法(內(nèi)核方法),初始化成員變量,執(zhí)?實(shí)例化代碼塊,調(diào)?類(lèi)的構(gòu)造?法,并把堆內(nèi)對(duì)象的?地址賦 值給引?變量。

Java對(duì)象分配內(nèi)存是否線(xiàn)程安全

  • CAS 加失敗重試保證更新原?性。

  • 把內(nèi)存分配按線(xiàn)程劃分在不同空間,即每個(gè)線(xiàn)程在 Java 堆中預(yù)先分配??塊內(nèi)存,叫做本地線(xiàn)程分配緩沖 TLAB,哪個(gè)線(xiàn)程要分配內(nèi)存就在對(duì)應(yīng)的 TLAB 分配,TLAB ?完了再進(jìn)?同步。

Java類(lèi)實(shí)例化順序

  • 父類(lèi)靜態(tài)成員和靜態(tài)初始化塊 ,按在代碼中出現(xiàn)的順序依次執(zhí)行
  • 子類(lèi)靜態(tài)成員和靜態(tài)初始化塊 ,按在代碼中出現(xiàn)的順序依次執(zhí)行
  • 父類(lèi)實(shí)例成員和實(shí)例初始化塊 ,按在代碼中出現(xiàn)的順序依次執(zhí)行
  • 父類(lèi)構(gòu)造方法
  • 子類(lèi)實(shí)例成員和實(shí)例初始化塊 ,按在代碼中出現(xiàn)的順序依次執(zhí)行
  • 子類(lèi)構(gòu)造方法

到此這篇關(guān)于Java對(duì)象存儲(chǔ)內(nèi)存布局詳解的文章就介紹到這了,更多相關(guān)Java對(duì)象內(nèi)存布局內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論