欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入講解Java的對象頭與對象組成

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

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

1,對象頭

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

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

一,對象頭

java的對象頭由以下三部分組成:

1,Mark Word

2,指向類的指針

3,數(shù)組長度(只有數(shù)組對象才有)

對象頭分為三個部分:

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

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

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

1,Mark Word

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

Mark Word在32位JVM中的長度是32bit,在64位JVM中長度是64bit。

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

鎖狀態(tài)

25bit

4bit

1bit

2bit

23bit

2bit

是否偏向鎖

鎖標志位

無鎖

對象的HashCode

分代年齡

0

01

偏向鎖

線程ID

Epoch

分代年齡

1

01

輕量級鎖

指向棧中鎖記錄的指針

00

重量級鎖

指向重量級鎖的指針

10

GC標記

11

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

JDK1.6以后的版本在處理同步鎖時存在鎖升級的概念,JVM對于同步鎖的處理是從偏向鎖開始的,隨著競爭越來越激烈,處理方式從偏向鎖升級到輕量級鎖,最終升級到重量級鎖。

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

1,當沒有被當成鎖時,這就是一個普通的對象,Mark Word記錄對象的HashCode,鎖標志位是01,是否偏向鎖那一位是0。

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

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

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

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

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

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

2,指向類的指針

該指針在32位JVM中的長度是32bit,在64位JVM中長度是64bit。

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

3,數(shù)組長度

只有數(shù)組對象保存了這部分數(shù)據(jù)。

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

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

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

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

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

總結(jié)

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

相關(guān)文章

  • Eclipse快速添加get、set方法的操作技巧

    Eclipse快速添加get、set方法的操作技巧

    這篇文章主要介紹了Eclipse快速添加get、set方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07
  • 基于SpringMVC入門案例及講解

    基于SpringMVC入門案例及講解

    這篇文章主要介紹了基于SpringMVC入門案例及講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • JNI語言基本知識

    JNI語言基本知識

    JNI是Java Native Interface的縮寫,它提供了若干的API實現(xiàn)了Java和其他語言的通信(主要是C&C++)。接下來通過本文給大家分享jni 基礎(chǔ)知識,感興趣的朋友一起看看吧
    2017-10-10
  • Java中的類加載器_動力節(jié)點Java學(xué)院整理

    Java中的類加載器_動力節(jié)點Java學(xué)院整理

    這篇文章主要為大家詳細介紹了Java中類加載器的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • MyBatis延遲加載實現(xiàn)步驟詳解

    MyBatis延遲加載實現(xiàn)步驟詳解

    這篇文章主要介紹了MyBatis延遲加載實現(xiàn)步驟詳解,? MyBatis中的延遲加載,也成為懶加載,是指在進行關(guān)聯(lián)查詢時,按照設(shè)置的延遲規(guī)則推遲對關(guān)聯(lián)對象的查詢,延遲加載可以有效的減少數(shù)據(jù)庫的壓力,需要的朋友可以參考下
    2023-10-10
  • jstack配合top命令分析CPU飆高、程序死鎖問題

    jstack配合top命令分析CPU飆高、程序死鎖問題

    記得前段時間,同事說他們測試環(huán)境的服務(wù)器cpu使用率一直處于100%,本地又沒有什么接口調(diào)用,為什么會這樣?cpu使用率居高不下,自然是有某些線程一直占用著cpu資源,那又如何查看占用cpu較高的線程
    2021-09-09
  • Java Stax解析XML示例

    Java Stax解析XML示例

    這篇文章主要介紹了Java Stax解析XML示例,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-09-09
  • 淺談Java操作符與其優(yōu)先級

    淺談Java操作符與其優(yōu)先級

    這篇文章主要介紹了淺談Java操作符與其優(yōu)先級,具有一定借鑒價值,需要的朋友可以了解下。
    2017-12-12
  • SpringBoot2 整合Nacos組件及環(huán)境搭建和入門案例解析

    SpringBoot2 整合Nacos組件及環(huán)境搭建和入門案例解析

    這篇文章主要介紹了SpringBoot2 整合Nacos組件,環(huán)境搭建和入門案例詳解,在整合springboot2時注意版本 0.2.x.RELEASE 對應(yīng)的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 對應(yīng)的是 Spring Boot 1.x 版本,具體內(nèi)容詳情跟隨小編一起看看吧
    2022-03-03
  • Java網(wǎng)絡(luò)編程TCP實現(xiàn)聊天功能

    Java網(wǎng)絡(luò)編程TCP實現(xiàn)聊天功能

    這篇文章主要為大家詳細介紹了Java網(wǎng)絡(luò)編程TCP實現(xiàn)聊天功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評論