日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

64位java_99.9%的Java程序员都说不清的问题:JVM中的对象内存布局?

發布時間:2025/3/19 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 64位java_99.9%的Java程序员都说不清的问题:JVM中的对象内存布局? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點擊上方石杉的架構筆記,右上選擇“設為星標

每日早8點半,精品技術文章準時送上

往期文章

BAT 面試官是如何360°無死角考察候選人的(上篇)

每秒上萬并發下的Spring Cloud參數優化實戰

分布式事務如何保障實際生產中99.99%高可用

記一位朋友斬獲 BAT 技術專家Offer的面試經歷

億級流量架構系列之如何支撐百億級數據的存儲與計算

作者:李瑞杰

目前就職于阿里巴巴,資深 JVM 研究人員

在 Java 程序中,我們擁有多種新建對象的方式。除了最為常見的 new 語句之外,我們還可以通過反射機制、Object.clone 方法、反序列化以及 Unsafe.allocateInstance 方法來新建對象。

其中,Object.clone 方法和反序列化通過直接復制已有的數據,來初始化新建對象的實例字段。

Unsafe.allocateInstance 方法則沒有初始化實例字段,而 new 語句和反射機制,則是通過調用構造器來初始化實例字段。????? ?

?我們先來考察new語句,準備一個類,如下圖所示

????????????? ??

讓我們編譯他的字節碼:

????? ??

可以看到,new語句編譯而成的字節碼將包含用來請求內存的 new 指令,以及用來調用構造器的 invokespecial 指令。????? ??

本文不是專門介紹invoke系列指令的,我會在后面的文章中介紹invoke系列指令。

不過在這里我多說一嘴,字節碼中的invokespecial指令通常用于調用私有實例方法、構造器,以及使用super關鍵字調用父類的實例方法或構造器,和所實現接口的默認方法。

提到構造器,就不得不提到 Java 對構造器的諸多約束。首先,如果一個類沒有定義任何構造器的話, Java 編譯器會自動添加一個無參數的構造器。????? ??

我們剛才的TestNew類,他的字節碼編譯出來后,有下面的片段。

????? ??

在JAVA源碼中,我們沒有定義構造器,但是生成出來的字節碼,已經自動幫我們添加了一個無參數的構造器。他使用的invokespecial方法最終調用的是其父類Object類的構造器方法。? ? ? ??

我將講述JVM的構造器調用原則,那就是,如果子類的構造器需要調用父類的構造器。如果父類存在無參數構造器的話,該調用可以是隱式的。也就是說, Java 編譯器會自動添加對父類構造器的調用。

但是,如果父類沒有無參數構造器,那么子類的構造器則需要顯式地調用父類帶參數的構造器。

顯式調用有兩種,一是直接使用“super”關鍵字調用父類構造器,二是使用“this”關鍵字調用同一個類中的其他構造器。

無論是直接的顯式調用,還是間接的顯式調用,都需要作為構造器的第一條語句,以便優先初始化繼承而來的父類字段。

可以不優先初始化繼承來的父類字段嗎?可以,如果你能使用字節碼注入工具的話。

當我們調用一個構造器時,它將優先調用父類的構造器,直至 Object 類。這些構造器的調用者皆為同一對象,也就是通過 new 指令新建而來的對象。? ? ? ??

事實上,我上面的陳述意味著:通過 new 指令新建出來的對象,它的內存其實涵蓋了所有父類中的實例字段。

也就是說,雖然子類無法訪問父類的私有實例字段,或者子類的實例字段隱藏了父類的同名實例字段,但是子類的實例還是會為這些父類實例字段分配內存的。????? ??

下面我將介紹壓縮指針技術。在 Java 虛擬機中,每個 Java 對象都有一個對象頭,它由標記字段和類型指針所構成。

標記字段用以存儲 Java 虛擬機有關該對象的運行數據,如哈希碼、GC 信息以及鎖信息,而類型指針則指向該對象的類。????????

在64位的JVM中,對象頭的標記字段占 64 位,而類型指針又占了 64 位。也就是說,每一個 Java 對象在內存中的額外開銷就是 16 個字節。????????

為了盡量較少對象的內存使用量,64位JVM引入了壓縮指針的概念,將堆中原本64位的Java對象指針壓縮成32位的。????????

這樣一來,對象頭中的類型指針也會被壓縮成32位,使得對象頭的大小從16字節降至12字節。

當然,壓縮指針不僅可以作用于對象頭的類型指針,還可以作用于引用類型的字段,以及引用類型數組。????? ??

它的原理是什么?答案是內存對齊

我們規定,默認情況下,JVM堆中對象的起始地址需要對齊至8的倍數,如果一個對象用不到8N 個字節,那么空白的那部分空間就浪費掉了,這些浪費掉的空間我們稱之為對象間的填充。

大家知道,指針里面存放的是地址,由于堆中對象的起始地址是對齊至8的倍數,所以指針存放一個引用(或者對象的類)的內存地址時,根本就不用存放最后的三位二進制數。

因為所有對象或類的內存地址都對齊了8,所以他們的內存地址的最低三位總是0,32位的指針就可以尋址到 2 的 35 次方個字節,也就是 32GB 的地址空間(超過 32GB 則會關閉壓縮指針)。

我們可以通過配置虛擬機的內存對齊選項來進一步提升尋址范圍。但是,這同時也可能增加對象間填充,導致壓縮指針沒有達到原本節省空間的效果。????????

就算是關閉了壓縮指針,Java 虛擬機還是會進行內存對齊。此外,內存對齊不僅存在于對象與對象之間,也存在于對象中的字段之間。

比如說,Java 虛擬機要求long字段、double字段,以及非壓縮指針狀態下的引用字段地址為8的倍數。????? ??

這是為什么呢?

CPU的緩存行機制大家應該有所耳聞,如果字段不是對齊的,那么就有可能出現跨緩存行的字段。

該字段的讀取可能需要替換兩個緩存行,而該字段的存儲也會同時污染兩個緩存行。

我們將在后期文章關于volatile關鍵詞的本質分析的過程中,再次考察到CPU緩存行的相關機制。????? ??

最后我要提一句的是,字段重排列技術,就是我剛才提到的,對象的字段之間存在的內存對齊。這指的是重新分配字段的先后順序,以達到內存對齊的目的

它有以下兩個規則:? ? ??

其一,如果一個字段占據C個字節,那么該字段的偏移量需要對齊至NC。這里的偏移量指的是字段地址與對象的起始地址差值。????????

以Long類為例,它僅有一個long類型的實例字段。在使用了壓縮指針的 64 位虛擬機中,盡管對象頭的大小為12個字節,該 long 類型字段的偏移量也只能是16,而中間空著的4個字節便會被浪費掉。????????

其二,子類所繼承字段的偏移量,需要與父類對應字段的偏移量保持一致。

說白了,比如B繼承了A,A是B的父類,A中所有的字段,在B中都有,而且是先放A的字段,再放B的字段。而且B類對象放A類字段時,需要與父類對應字段的偏移量保持一致。

接下來我說一個拓展內容吧,什么是虛共享?

假設兩個線程分別訪問同一對象中不同的 volatile 字段,邏輯上它們并沒有共享內容,因此不需要同步。

如果這兩個字段恰好在同一個緩存行中,那么對這些字段的寫操作會導致緩存行的寫回,也就造成了實質上的共享。

Java8還引入了一個新的注釋@Contended,用來解決對象字段之間的虛共享。

Java 虛擬機會讓不同的@Contended字段處于獨立的緩存行中,因此你會看到大量的空間被浪費掉,避免無謂的緩存行同步操作。

具體的算法屬于實現細節了,大家有興趣可以去用:

-XX:-RestrictContended

這個虛擬機選項,查看Contended字段的內存布局。

END

劃至底部,點擊“在看”,是你來過的儀式感!

推薦閱讀

  • 簡歷寫了會Kafka,面試官90%會讓你講講acks參數對消息持久化的影響!

  • 面試最讓你手足無措的一個問題:你的系統如何支撐高并發?

  • Java高階必備:如何優化Spring Cloud微服務注冊中心架構?

  • 高并發場景下,如何保證生產者投遞到消息中間件的消息不丟失?

  • 從團隊自研的百萬并發中間件系統的內核設計看Java并發性能優化!

  • 如果20萬用戶同時訪問一個熱點緩存,如何優化你的緩沖架構?

更多文章:

  • 2018年原創匯總

  • 2019年原創匯總(持續更新)

  • 爆款推薦

  • 面試專欄

歡迎長按下圖關注公眾號石杉的架構筆記

BAT架構經驗傾囊相授

總結

以上是生活随笔為你收集整理的64位java_99.9%的Java程序员都说不清的问题:JVM中的对象内存布局?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: av私库| 大奶一区 | 国产精品久久久久久影视 | 一区二区不卡免费视频 | 麻豆精品在线看 | 国产三级自拍 | 欧美成人区 | 久久99精品国产麻豆婷婷洗澡 | 老汉色av | 成人性生生活性生交全黄 | 涩涩视频免费观看 | 水果视频污 | 欧美日韩三区 | 日本人妖xxxx | 日产毛片 | 欧美精品第二页 | 僵尸艳谈 | 精品一区二区在线观看视频 | 日本a在线免费观看 | 亚洲午码 | 少妇一级淫免费放 | 日本色一区| 污污网址在线观看 | 国产黄色大全 | 国产又大又硬又粗 | 国产女人精品 | 1024欧美| 亚洲国产免费视频 | 伊人伊人鲁 | 中文字幕久久精品 | 日韩精品一二 | 成人在线直播 | 午夜影院在线免费观看 | 日本黄xxxxxxxxx100 | 日韩日日夜夜 | 国产黄色一级网站 | 无码人妻精品一区二区三 | 天天射天天拍 | 中文字幕在线观看线人 | 一本久道久久综合 | 黄色一级大片免费版 | 国产情侣自拍一区 | 成人18视频 | 色一涩| 中文字幕一区二区三 | 四虎精品在线播放 | 91色啪| 天天综合91 | 日韩色一区 | 日本在线成人 | 亚洲免费av一区二区 | 欧美成人高清在线 | 无码国产69精品久久久久同性 | 深爱五月激情网 | 欢乐谷在线观看免费播放高清 | 裸体视频软件 | 黄视频国产 | 国产一区美女 | 台湾黄色网址 | 久久久久久久国产精品 | 国产精品自拍电影 | 性欧美熟妇videofreesex | 高柳家在线观看 | 日韩精品无码一区二区 | 九九99精品 | 欧美两根一起进3p做受视频 | 亚洲精品77777 | 久久精品电影网 | 午夜精品视频在线 | 黑色丝袜吻戏亲胸摸腿 | 在线视频观看一区 | 国产精品久久一区二区三区 | 免费黄视频在线观看 | 日本天堂在线观看 | 天天色小说 | 深夜国产视频 | 色午夜 | 亚洲美女性视频 | 欧美一区二区三区啪啪 | 午夜在线不卡 | 国产精品自拍小视频 | 一级片免费看视频 | 91精产国品 | 精品国产一区二区三区四区精华 | 欧美 国产 日本 | 性的免费视频 | 欧美毛片基地 | 尤物av在线 | 91美女网站 | 怡红院一区二区三区 | 高清久久久久久 | 国产123区在线观看 91国产一区二区 | 美女扒开腿让男人捅 | 超碰青草| 在线视频欧美日韩 | 国产999在线观看 | 亚洲一区二区三区影视 | 涩涩爱在线 | 中文字幕素人 |