最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入講解Java的對(duì)象頭與對(duì)象組成

 更新時(shí)間:2022年02月07日 09:58:15   作者:lkforce  
由于Java面向?qū)ο蟮乃枷?在JVM中需要大量存儲(chǔ)對(duì)象,存儲(chǔ)時(shí)為了實(shí)現(xiàn)一些額外的功能,需要在對(duì)象中添加一些標(biāo)記字段用于增強(qiáng)對(duì)象功能,這些標(biāo)記字段組成了對(duì)象頭,下面這篇文章主要給大家介紹了關(guān)于Java對(duì)象頭與對(duì)象組成的相關(guān)資料,需要的朋友可以參考下

Java對(duì)象保存在內(nèi)存中時(shí),由以下三部分組成:

1,對(duì)象頭

2,實(shí)例數(shù)據(jù)

3,對(duì)齊填充字節(jié)

一,對(duì)象頭

java的對(duì)象頭由以下三部分組成:

1,Mark Word

2,指向類的指針

3,數(shù)組長(zhǎng)度(只有數(shù)組對(duì)象才有)

對(duì)象頭分為三個(gè)部分:

一、Mark Word部分,從名字就能知道它是一個(gè)記錄和描述對(duì)象的部分。這也是我接下來(lái)主要講解的部分,因?yàn)槠渌膬?nèi)容,基本沒有多大的變化情況。占八字節(jié)內(nèi)存。

二、類型指針部分,也叫元數(shù)據(jù)指針什么的,主要是存儲(chǔ)元數(shù)據(jù)的地址,對(duì)于對(duì)象的類型信息,指向方法區(qū)的類信息部分,對(duì)于對(duì)象的成員變量部分,基本類型就指向方法區(qū)的運(yùn)行時(shí)常量池,String類型指向在jdk1.7之后從方法區(qū)移到堆區(qū)的字符串常量池,其他的對(duì)象類型,則指向堆區(qū)的對(duì)象存儲(chǔ)地址。占八字節(jié)內(nèi)存,jvm有默認(rèn)開啟指針壓縮,因?yàn)榘l(fā)現(xiàn)類型指針部分用不了64位那么多,所以被指針壓縮后,成為了四字節(jié),指針壓縮的原理,這里我就不說(shuō)了,非本文重點(diǎn)。

三、數(shù)組數(shù)據(jù)部分,專門用來(lái)存儲(chǔ)數(shù)組數(shù)據(jù)。

1,Mark Word

Mark Word記錄了對(duì)象和鎖有關(guān)的信息,當(dāng)這個(gè)對(duì)象被synchronized關(guān)鍵字當(dāng)成同步鎖時(shí),圍繞這個(gè)鎖的一系列操作都和Mark Word有關(guān)。

Mark Word在32位JVM中的長(zhǎng)度是32bit,在64位JVM中長(zhǎng)度是64bit。

Mark Word在不同的鎖狀態(tài)下存儲(chǔ)的內(nèi)容不同,在32位JVM中是這么存的:

鎖狀態(tài)

25bit

4bit

1bit

2bit

23bit

2bit

是否偏向鎖

鎖標(biāo)志位

無(wú)鎖

對(duì)象的HashCode

分代年齡

0

01

偏向鎖

線程ID

Epoch

分代年齡

1

01

輕量級(jí)鎖

指向棧中鎖記錄的指針

00

重量級(jí)鎖

指向重量級(jí)鎖的指針

10

GC標(biāo)記

11

其中無(wú)鎖和偏向鎖的鎖標(biāo)志位都是01,只是在前面的1bit區(qū)分了這是無(wú)鎖狀態(tài)還是偏向鎖狀態(tài)。

JDK1.6以后的版本在處理同步鎖時(shí)存在鎖升級(jí)的概念,JVM對(duì)于同步鎖的處理是從偏向鎖開始的,隨著競(jìng)爭(zhēng)越來(lái)越激烈,處理方式從偏向鎖升級(jí)到輕量級(jí)鎖,最終升級(jí)到重量級(jí)鎖。

JVM一般是這樣使用鎖和Mark Word的:

1,當(dāng)沒有被當(dāng)成鎖時(shí),這就是一個(gè)普通的對(duì)象,Mark Word記錄對(duì)象的HashCode,鎖標(biāo)志位是01,是否偏向鎖那一位是0。

2,當(dāng)對(duì)象被當(dāng)做同步鎖并有一個(gè)線程A搶到了鎖時(shí),鎖標(biāo)志位還是01,但是否偏向鎖那一位改成1,前23bit記錄搶到鎖的線程id,表示進(jìn)入偏向鎖狀態(tài)。

3,當(dāng)線程A再次試圖來(lái)獲得鎖時(shí),JVM發(fā)現(xiàn)同步鎖對(duì)象的標(biāo)志位是01,是否偏向鎖是1,也就是偏向狀態(tài),Mark Word中記錄的線程id就是線程A自己的id,表示線程A已經(jīng)獲得了這個(gè)偏向鎖,可以執(zhí)行同步鎖的代碼。

4,當(dāng)線程B試圖獲得這個(gè)鎖時(shí),JVM發(fā)現(xiàn)同步鎖處于偏向狀態(tài),但是Mark Word中的線程id記錄的不是B,那么線程B會(huì)先用CAS操作試圖獲得鎖,這里的獲得鎖操作是有可能成功的,因?yàn)榫€程A一般不會(huì)自動(dòng)釋放偏向鎖。如果搶鎖成功,就把Mark Word里的線程id改為線程B的id,代表線程B獲得了這個(gè)偏向鎖,可以執(zhí)行同步鎖代碼。如果搶鎖失敗,則繼續(xù)執(zhí)行步驟5。

5,偏向鎖狀態(tài)搶鎖失敗,代表當(dāng)前鎖有一定的競(jìng)爭(zhēng),偏向鎖將升級(jí)為輕量級(jí)鎖。JVM會(huì)在當(dāng)前線程的線程棧中開辟一塊單獨(dú)的空間,里面保存指向?qū)ο箧iMark Word的指針,同時(shí)在對(duì)象鎖Mark Word中保存指向這片空間的指針。上述兩個(gè)保存操作都是CAS操作,如果保存成功,代表線程搶到了同步鎖,就把Mark Word中的鎖標(biāo)志位改成00,可以執(zhí)行同步鎖代碼。如果保存失敗,表示搶鎖失敗,競(jìng)爭(zhēng)太激烈,繼續(xù)執(zhí)行步驟6。

6,輕量級(jí)鎖搶鎖失敗,JVM會(huì)使用自旋鎖,自旋鎖不是一個(gè)鎖狀態(tài),只是代表不斷的重試,嘗試搶鎖。從JDK1.7開始,自旋鎖默認(rèn)啟用,自旋次數(shù)由JVM決定。如果搶鎖成功則執(zhí)行同步鎖代碼,如果失敗則繼續(xù)執(zhí)行步驟7。

7,自旋鎖重試之后如果搶鎖依然失敗,同步鎖會(huì)升級(jí)至重量級(jí)鎖,鎖標(biāo)志位改為10。在這個(gè)狀態(tài)下,未搶到鎖的線程都會(huì)被阻塞。

2,指向類的指針

該指針在32位JVM中的長(zhǎng)度是32bit,在64位JVM中長(zhǎng)度是64bit。

Java對(duì)象的類數(shù)據(jù)保存在方法區(qū)。

3,數(shù)組長(zhǎng)度

只有數(shù)組對(duì)象保存了這部分?jǐn)?shù)據(jù)。

該數(shù)據(jù)在32位和64位JVM中長(zhǎng)度都是32bit。

二,實(shí)例數(shù)據(jù)

對(duì)象的實(shí)例數(shù)據(jù)就是在java代碼中能看到的屬性和他們的值。

三,對(duì)齊填充字節(jié)

因?yàn)镴VM要求java的對(duì)象占的內(nèi)存大小應(yīng)該是8bit的倍數(shù),所以后面有幾個(gè)字節(jié)用于把對(duì)象的大小補(bǔ)齊至8bit的倍數(shù),沒有特別的功能。

總結(jié)

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

相關(guān)文章

  • Java 和 JavaScript 真正通用的Base64編碼詳解

    Java 和 JavaScript 真正通用的Base64編碼詳解

    這篇文章主要介紹了Java 和 JavaScript 真正通用的Base64編碼詳解的相關(guān)資料,附有Java和Javascript 的Base64編碼,需要的朋友可以參考下
    2016-11-11
  • Spring Boot優(yōu)化后啟動(dòng)速度快到飛起技巧示例

    Spring Boot優(yōu)化后啟動(dòng)速度快到飛起技巧示例

    這篇文章主要為大家介紹了Spring Boot優(yōu)化后啟動(dòng)速度快到飛起的技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Java雪花算法的原理和實(shí)現(xiàn)方法

    Java雪花算法的原理和實(shí)現(xiàn)方法

    這篇文章主要介紹了Java雪花算法的原理和實(shí)現(xiàn)方法,雪花算法是一種分布式唯一ID生成算法,可以生成全局唯一的ID標(biāo)識(shí)符,就像自然界中雪花一般沒有相同的雪花,下面將詳細(xì)介紹,感興趣的可以學(xué)習(xí)一下
    2023-10-10
  • 為何Java單例模式我只推薦兩種

    為何Java單例模式我只推薦兩種

    這篇文章主要給大家介紹了關(guān)于Java單例模式推薦的兩種模式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • java實(shí)現(xiàn)隨機(jī)驗(yàn)證碼圖片生成

    java實(shí)現(xiàn)隨機(jī)驗(yàn)證碼圖片生成

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)隨機(jī)驗(yàn)證碼圖片生成,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Mybatis 數(shù)據(jù)庫(kù)連接池的實(shí)現(xiàn)示例

    Mybatis 數(shù)據(jù)庫(kù)連接池的實(shí)現(xiàn)示例

    在Java應(yīng)用程序中,與數(shù)據(jù)庫(kù)的連接是非常昂貴的,因此,當(dāng)我們使用MyBatis進(jìn)行數(shù)據(jù)操作時(shí),需要一個(gè)連接池來(lái)分配并管理這些連接,本文主要介紹了Mybatis 數(shù)據(jù)庫(kù)連接池的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • Spring?MVC??接受請(qǐng)求參數(shù)的方法

    Spring?MVC??接受請(qǐng)求參數(shù)的方法

    了解HTTP請(qǐng)求的GET和POST方法中如何攜帶參數(shù),以及SpringMVC中如何接收這些參數(shù),GET方法通過(guò)URL傳遞參數(shù),而POST方法通常在請(qǐng)求體中傳遞,SpringMVC使用注解如@RequestParam和@RequestBody來(lái)綁定參數(shù)到控制器方法
    2024-09-09
  • Java中字符串替換的4種方法代碼舉例

    Java中字符串替換的4種方法代碼舉例

    這篇文章主要介紹了Java中四種字符串替換方法,分別是String.replace()、String.replaceAll()、String.replaceFirst()和StringBuilder.replace(),并對(duì)比了它們的特點(diǎn)和適用場(chǎng)景,需要的朋友可以參考下
    2025-02-02
  • 如何在mybatis中向BLOB字段批量插入數(shù)據(jù)

    如何在mybatis中向BLOB字段批量插入數(shù)據(jù)

    這篇文章主要介紹了如何在mybatis中向BLOB字段批量插入數(shù)據(jù)的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-10-10
  • 一篇文章帶你深入了解Java異常

    一篇文章帶你深入了解Java異常

    本篇文章主要介紹了java異常處理機(jī)制及應(yīng)用,異常處理機(jī)制是Java語(yǔ)言的一大特色。從異常處理的機(jī)制、異常處理的方法、異常處理的原則等方面介紹Java語(yǔ)言的異常處理技術(shù),有興趣的可以了解一下
    2021-08-08

最新評(píng)論

化德县| 府谷县| 平乡县| 济宁市| 平阴县| 东辽县| 天门市| 全椒县| 望谟县| 嫩江县| 宽甸| 勃利县| 兴国县| 裕民县| 四平市| 军事| 曲麻莱县| 集安市| 农安县| 辽源市| 普宁市| 合江县| 岱山县| 甘德县| 错那县| 皮山县| 大化| 贡嘎县| 上蔡县| 郯城县| 通道| 乡城县| 德昌县| 阜宁县| 广饶县| 南陵县| 齐齐哈尔市| 乾安县| 江山市| 惠水县| 星座|