精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

New 一個對象在堆中的歷程

開發 前端
至于 JVM 怎么知道這個空間得分配多大呢?事實上,對象所需內存的大小在類加載完成后就已經可以完全確定了。

小伙伴們大家好呀,我是小牛肉~ 我寫文章的流程一般都是先在看書和看博客的過程中做做筆記,然后過一段時間再把這些筆記總結成文章輸出出來,這樣一來能夠加深影響,二來也不至于文章的質量太低。從這篇文章的草稿筆記到現在決定開始成文,其實已經有一個月了,本來覺得趁著寒假可以順理成章地脫離惡心的深度學習然后好好地把 JVM 知識點全都掃一遍,正好囤幾篇文章,誰知道回家后根本無心看書,只能每天刷幾道 LeetCode 來彌補下日積月累的焦慮和罪惡感。

STOP,廢話結束

今天介紹兩個 JVM 中的高頻基礎題:

  • 對象的創建過程(new 一個對象在堆中的歷程)
  • 對象在堆上分配的兩種方式

對象的創建過程分五步走,如下圖:

我感覺 JVM 如果不看 GC 收集器那塊(滑稽),似乎東西還不多

老規矩,背誦版在文末。點擊閱讀原文可以直達我收錄整理的各大廠面試真題

類加載檢查

對象創建過程的第一步,所謂類加載檢查,就是檢測我們接下來要 new 出來的這個對象所屬的類是否已經被 JVM 成功加載、解析和初始化過了(具體的類加載過程會在后續文章詳細解釋~)

具體來說,當 Java 虛擬機遇到一條字節碼 new 指令時:

1)首先檢查根據 class 文件中的常量池表(Constant Pool Table)能否找到這個類對應的符號引用

此處可以回顧一波常量池表 (Constant Pool Table) 的概念:

用于存放編譯期生成的各種字面量(字面量相當于 Java 語言層面常量的概念,如文本字符串,聲明為 final 的常量值等)與符號引用。有一些文章會把 class 常量池表稱為靜態常量池。

都是常量池,常量池表和方法區中的運行時常量池有啥關系嗎?運行時常量池是干嘛的呢?

運行時常量池可以在運行期間將 class 常量池表中的符號引用解析為直接引用。簡單來說,class 常量池表就相當于一堆索引,運行時常量池根據這些索引來查找對應方法或字段所屬的類型信息和名稱及描述符信息

2)然后去方法區中的運行時常量池中查找該符號引用所指向的類是否已被 JVM 加載、解析和初始化過

如果沒有,那就先執行相應的類加載過程

如果有,那么進入下一步,為新生對象分配內存

分配內存

類加載檢查通過后,這個對象待會兒要是被創建出來得有地方放他對吧?

所以接下來 JVM 會為新生對象分配內存空間。

至于 JVM 怎么知道這個空間得分配多大呢?事實上,對象所需內存的大小在類加載完成后就已經可以完全確定了。在 Hotspot 虛擬機中,對象在內存中的布局可以分為 3 塊區域:對象頭、實例數據和對齊填充。

1)Hotspot 虛擬機的對象頭包括兩部分信息:

  • 第一部分用于存儲對象自身的運行時數據(如哈希碼(HashCode)、GC 分代年齡、鎖狀態標志、線程持有的鎖、偏向線程 ID、偏向時間戳等,這部分數據的長度在 32 位和 64 位的虛擬機(未開啟壓縮指針)中分別為 32 個比特和 64 個比特,官方稱它為 “Mark Word”。學過 synchronized 的小伙伴對這個一定不陌生~)
  • 另一部分是類型指針,即對象指向它的類型元數據的指針,虛擬機通過這個指針來確定這個對象是哪個類的實例

2)實例數據部分存儲的是這個對象真正的有效信息,即我們在程序代碼里面所定義的各種類型的字段內容,無論是從父類繼承下來的,還是在子類中定義的字段都必須記錄起來。

3)對齊填充部分不是必須的,也沒有什么特別的含義,僅僅起占位作用。因為 Hotspot 虛擬機的自動內存管理系統要求對象起始地址必須是 8 字節的整數倍,換句話說就是對象的大小必須是 8 字節的整數倍。而對象頭部分正好是 8 字節的倍數(1 倍或 2 倍),因此,當對象實例數據部分沒有對齊時,就需要通過對齊填充來補全。

對象在堆上的兩種分配方式

為對象分配內存空間的任務通俗來說把一塊確定大小的內存塊從 Java 堆中劃分出來給這個對象用。

根據堆中的內存是否規整,有兩種劃分方式,或者說對象在堆上的分配有兩種方式:

1)假設 Java 堆中內存是絕對規整的,所有被使用過的內存都被放在一邊,空閑的內存被放在另一邊,中間放著一個指針作為分界點的指示器,那所分配內存就僅僅是把這個指針 向 空閑空間方向 挪動一段與對象大小相等的距離,這種分配方式稱為 指針碰撞(Bump The Pointer)

2)如果 Java 堆中的內存并不是規整的,已被使用的內存和空閑的內存相互交錯在一起,那就沒有辦法簡單地進行指針碰撞了,虛擬機就必須維護一個列表,記錄哪些內存塊是可用的,在分配的時候從列表中找到一塊足夠大的連續空間劃分給這個對象,并更新列表上的記錄,這種分配方式稱為 空閑列表(Free List)。

選擇哪種分配方式由 Java 堆是否規整決定,那又有同學會問了,堆是否規整又由誰來決定呢?

Java 堆是否規整由所采用的垃圾收集器是否帶有空間壓縮整理(Compact)的能力決定的(或者說由垃圾收集器采用的垃圾收集算法來決定的,具體垃圾收集算法見后續文章):

因此,當使用 Serial、ParNew 等帶壓縮整理過程的收集器時,系統采用的分配算法是指針碰撞,既簡單又高效

而當使用 CMS 這種基于清除(Sweep)算法的收集器時,理論上就只能采用較為復雜的空閑列表來分配內存

對象創建時候的并發安全問題

另外,在為對象創建內存的時候,還需要考慮一個問題:并發安全問題。

對象創建在虛擬機中是非常頻繁的行為,以上面介紹的指針碰撞法為例,即使只修改一個指針所指向的位置,在并發情況下也并不是線程安全的,可能出現某個線程正在給對象 A 分配內存,指針還沒來得及修改,另一個線程創建了對象 B 又同時使用了原來的指針來分配內存的情況。

解決這個問題有兩種可選方案:

  • 方案 1:CAS + 失敗重試:CAS 大伙應該都熟悉,比較并交換,樂觀鎖方案,如果失敗就重試,直到成功為止
  • 方案 2:本地線程分配緩沖(Thread Local Allocation Buffer,TLAB):每個線程在堆中預先分配一小塊內存,每個線程擁有的這一小塊內存就稱為 TLAB。哪個線程要分配內存了,就在哪個線程的 TLAB 中進行分配,這樣各個線程之間互不干擾。如果某個線程的 TLAB 用完了,那么虛擬機就需要為它分配新的 TLAB,這時才需要進行同步鎖定。可以通過 -XX:+/-UseTLAB 參數來設定是否使用 TLAB。

初始化零值

內存分配完成之后,JVM 會將分配到的內存空間(當然不包括對象頭啦)都初始化為零值,比如 boolean 字段都初始化為 false 啊,int 字段都初始化為 0 啊之類的

這步操作保證了對象的實例字段在 Java 代碼中可以不賦初始值就直接使用,使程序能訪問到這些字段的數據類型所對應的零值。

如果使用了 TLAB 的話,初始化零值這項工作可以提前至 TLAB 分配時就順便進行了

設置對象頭

上面我們說過,對象在內存中的布局可以分為 3 塊區域:對象頭(Object Header)、實例數據和對齊填充

對齊填充并不是什么有意義的數據,實例數據我們在上一步操作中進行了初始化零值,那么對于剩下的對象頭中的信息來說,自然不必多說,也是要進行一些賦值操作的:例如這個對象是哪個類的實例、如何才能找到類的元數據信息、對象的哈希碼、對象的 GC 分代年齡等信息。根據虛擬機當前運行狀態的不同,如是否啟用偏向鎖等,對象頭會有不同的設置方式。

執行 init 方法

上面四個步驟都走完之后,從 JVM 的視角來看,其實一個新的對象已經成功誕生了。

但是從我們程序員的視角來看,這個對象確實是創建出來了,但是還沒按照我們定義的構造函數來進行賦值呢,所有的字段都還是默認的零值啊。

構造函數即 Class 文件中的 () 方法,一般來說,new 指令之后會接著執行 ()方法,按照構造函數的意圖對這個對象進行初始化,這樣一個真正可用的對象才算完全地被構造出來了,皆大歡喜。

最后放上這道題的背誦版:

?? 面試官:講一下對象的創建過程

?? 小牛肉:new 一個對象在堆中的過程主要分為五個步驟:

1)類加載檢查:具體來說,當 Java 虛擬機遇到一條字節碼 new 指令時,它會首先檢查根據 class 文件中的常量池表(Constant Pool Table)能否找到這個類對應的符號引用,然后去方法區中的運行時常量池中查找該符號引用所指向的類是否已被 JVM 加載、解析和初始化過

  • 如果沒有,那就先執行相應的類加載過程
  • 如果有,那么進入下一步,為新生對象分配內存

2)分配內存:就是在堆中給劃分一塊內存空間分配給這個新生對象用。具體的分配方式根據堆內存是否規整有兩種方式:

  • 堆內存規整的話采用的分配方式就是指針碰撞:所有被使用過的內存都被放在一邊,空閑的內存被放在另一邊,中間放著一個指針作為分界點的指示器,分配內存就是把這個指針向空閑空間方向挪動一段與對象大小相等的距離
  • 堆內存不規整的話采用的分配方式就是空閑列表:所謂內存不規整就是已被使用的內存和空閑的內存相互交錯在一起,那就沒有辦法簡單地進行指針碰撞了,JVM 就必須維護一個列表,記錄哪些內存塊是可用的,在分配的時候從列表中找到一塊足夠大的連續空間劃分給這個對象,并更新列表上的記錄,這就是空閑列表的方式

3)初始化零值:對象在內存中的布局可以分為 3 塊區域:對象頭、實例數據和對齊填充,對齊填充僅僅起占位作用,沒啥特殊意義,初始化零值這個操作就是初始化實例數據這個部分,比如 boolean 字段初始化為 false 之類的

4)設置對象頭:這個步驟就是設置對象頭中的一些信息

5)執行 init 方法:最后就是執行構造函數,構造函數即 Class 文件中的 ()方法,一般來說,new 指令之后會接著執行() 方法,按照構造函數的意圖對這個對象進行初始化,這樣一個真正可用的對象才算完全地被構造出來了


責任編輯:武曉燕 來源: 飛天小牛肉
相關推薦

2009-05-20 09:49:15

2011-09-19 10:19:04

NoSQL

2024-04-11 08:30:05

JavaScript數組函數

2023-03-15 09:00:43

SwiftUISlider

2015-08-06 13:44:21

swiftcocoapods

2011-09-08 10:46:12

Widget

2014-05-26 09:13:46

DockerPython

2021-01-04 09:12:31

集合變量

2023-10-14 17:49:25

Java存儲

2017-08-17 14:38:39

JavaAbstract抽象

2020-12-04 17:21:18

前端開發技術

2021-11-02 14:54:41

排序數組元素

2021-12-13 11:31:36

排序數組數據結構算法

2024-08-12 08:33:05

2020-06-28 08:10:00

GoGOSSAFUNC圖編程語言

2021-07-28 20:12:17

WindowsHeap內存

2020-09-29 07:24:14

Python字典數據

2021-07-31 12:58:53

PodmanLinux虛擬機

2011-05-19 15:14:49

PostgreSQL

2011-03-15 16:07:33

Windows AzuWCF
點贊
收藏

51CTO技術棧公眾號

日韩不卡一区二区三区| 日本一区二区中文字幕| 久久九九久久九九| 国产美女被下药99| 欧美黄色免费看| 国产96在线亚洲| 在线观看日韩高清av| 天天干天天色天天爽| 天堂在线资源8| 日韩激情中文字幕| 欧美激情亚洲综合一区| 免费看黄色的视频| 一级毛片精品毛片| 欧美在线观看视频一区二区三区| 亚洲成人动漫在线| 婷婷婷国产在线视频| 精品一区二区三区的国产在线播放| 久久久久久国产精品久久| 丰满少妇高潮一区二区| 美女精品视频在线| 色先锋久久av资源部| 中文字幕av久久| 天堂√在线中文官网在线| 精品一区二区三区在线播放 | 色一区在线观看| 黄色一级片av| 日本中文字幕在线观看| 97久久精品人人做人人爽50路| 国产日韩在线视频| 麻豆精品久久久久久久99蜜桃| 午夜激情久久| 亚洲欧美精品中文字幕在线| 欧美性受xxxx黒人xyx性爽| 一个人看的www视频在线免费观看| 日韩一区有码在线| 日本在线播放一区| 亚洲欧美日韩精品永久在线| 国产美女精品一区二区三区| 国产精品久久久久久久久久久久久久| 日韩男人的天堂| 午夜日韩电影| 久久国产精品亚洲| 夫妻性生活毛片| 欧美好骚综合网| 一区二区三区动漫| 精品欧美一区二区久久久| 天堂资源在线亚洲| 亚洲国产精品小视频| 一二三区视频在线观看| 欧美经典一区| 日韩一区二区在线观看视频| 亚洲av无日韩毛片久久| 亚州欧美在线| 91精品国产日韩91久久久久久| 婷婷激情四射五月天| 欧美三级精品| 欧美性做爰猛烈叫床潮| 丁香婷婷激情网| 韩日一区二区| 欧美日韩成人在线一区| www.cao超碰| 国产aⅴ精品一区二区四区| 51精品视频一区二区三区| 日本中文字幕观看| 免费观看性欧美大片无片| 日韩一区二区三区在线视频| 国产农村妇女精品久久| 色妞ww精品视频7777| 精品精品国产高清a毛片牛牛 | 99麻豆久久久国产精品免费| 精品国产乱码久久久久| 久青青在线观看视频国产| 国产亚洲视频系列| 五月天婷亚洲天综合网鲁鲁鲁| 999在线视频| 亚洲人成精品久久久久久| 日本中文字幕一级片| av在线不卡免费| 欧美午夜精品久久久久久浪潮| 亚洲爆乳无码专区| 欧美亚洲二区| 日韩欧美二区三区| 在线观看国产网站| 欧洲grand老妇人| 久久大大胆人体| 日本一区二区欧美| 日韩精品一级二级| 51精品国产人成在线观看| 男人天堂av网| 国产欧美综合在线观看第十页| 伊人久久大香线蕉成人综合网| www在线免费观看视频| 性久久久久久久久久久久| 黑鬼大战白妞高潮喷白浆| 日韩黄色三级在线观看| 精品久久久久久最新网址| 欧美日韩高清丝袜| 午夜国产精品视频免费体验区| 777精品视频| 国产乱码久久久| 2020日本不卡一区二区视频| 亚洲最新在线| 国产伦理精品| 91精品久久久久久久91蜜桃| 国产毛片毛片毛片毛片毛片毛片| 成人羞羞在线观看网站| 国产最新精品视频| 黄色在线观看国产| 国产伦精品一区二区三区免费迷 | 亚洲福利电影网| 久久综合伊人77777麻豆最新章节| 日韩成人视屏| 尤物九九久久国产精品的分类| 美女毛片在线观看| 日本亚洲欧美天堂免费| 国产精品视频在线免费观看| jizz日韩| 欧美日韩综合视频| 自拍一级黄色片| 成人网18免费网站| 欧美一区二区三区免费观看 | 美女写真久久影院| 精品久久人人做人人爽| 51精品免费网站| 日韩av一区二区三区四区| 国产在线一区二| 日韩精品亚洲人成在线观看| 欧美剧在线免费观看网站| 免费黄色在线视频| 亚洲精品精选| 国产精品国产三级欧美二区| 看黄网站在线| 欧美视频在线观看一区| 久久av无码精品人妻系列试探| 黄色欧美成人| 成人黄动漫网站免费| 成年人网站在线| 欧美日韩一级二级| av永久免费观看| 久久激情久久| 欧美日韩在线高清| 五月天av在线| 日韩经典中文字幕| 特一级黄色大片| 不卡在线观看av| 人人妻人人澡人人爽欧美一区| 97色婷婷成人综合在线观看| 中文字幕日本精品| 在线免费观看一级片| 欧美激情在线一区二区三区| 国产天堂在线播放| 国产免费播放一区二区| 日本欧美爱爱爱| 你懂的免费在线观看视频网站| 欧美日韩中国免费专区在线看| 一区二区视频观看| 亚洲影音一区| 午夜欧美性电影| 亚洲精品成a人ⅴ香蕉片| 色午夜这里只有精品| 亚洲综合精品国产一区二区三区| 国产精品理伦片| 91网址在线观看精品| 亚洲精品久久久狠狠狠爱 | 国产香蕉精品| 91av在线网站| 国产一级免费在线观看| 精品视频一区三区九区| 日本一二三区在线观看| 成人一区在线看| 色婷婷综合久久久久中文字幕| 欧美一区二区三区高清视频| 成人日韩在线电影| 黄页网站在线观看免费| 亚洲毛片在线免费观看| 97人妻精品视频一区| 亚洲欧洲韩国日本视频| 美女久久久久久久久| 久久国产66| 天天做天天爱天天高潮| 精品国产影院| 国产精品久久久久av| 4438x成人网全国最大| 亚洲国产精品女人久久久| 丰满熟女人妻一区二区三| 亚洲女爱视频在线| 久久久久久久久久久国产精品| 久久精品久久精品| 波多野结衣综合网| 成人羞羞视频在线看网址| 国产91精品入口17c| 欧美最新精品| 久久久久久成人| 性开放的欧美大片| 亚洲精品xxxx| 国产精品久久久久久69| 天天av天天翘天天综合网| 久久精品国产亚洲AV成人婷婷| 国产成人av电影在线| 国产一级不卡毛片| 亚洲无线视频| 偷拍盗摄高潮叫床对白清晰| 色先锋久久影院av| 91超碰rencao97精品| 中文字幕av一区二区三区佐山爱| 久久999免费视频| 手机免费看av片| 国产精品久久久久久久免费软件| 久久久一二三四| 亚欧日韩另类中文欧美| 99国产超薄肉色丝袜交足的后果| 手机看片久久| 97人人爽人人喊人人模波多| 九七久久人人| 亚洲性av网站| 色吊丝在线永久观看最新版本| 91精品国产色综合久久ai换脸| 亚洲婷婷久久综合| 狠狠久久五月精品中文字幕| av免费观看国产| 色天使综合视频| 欧美亚洲一级片| 99在线视频影院| 欧美精品免费播放| 国产理论在线观看| 中文字幕亚洲自拍| 韩国三级在线观看久| 亚洲黄色免费三级| 亚洲av综合色区无码一二三区 | 国产精品女人毛片| 大地资源二中文在线影视观看| 国产成人一区二区精品非洲| 天堂中文av在线| 日韩成人一级大片| 天天摸天天碰天天添| 中日韩男男gay无套| 久久国产午夜精品理论片最新版本| 91超碰成人| 国产又大又长又粗又黄| 成人综合久久| 亚洲国产成人不卡| 日韩激情免费| 亚洲福利av| 日韩免费久久| 一区二区精品视频| 久久精品国内一区二区三区水蜜桃| 偷拍视频一区二区| 红桃视频在线观看一区二区| 欧美连裤袜在线视频| 免费成人网www| 欧美中文娱乐网| 欧美限制电影| 在线成人av电影| 亚洲国产不卡| 国产一区二区三区在线免费| 欧美午夜国产| 婷婷无套内射影院| 亚洲一区二区三区免费在线观看 | www.日韩| 国产精品高潮呻吟久久av黑人| 日韩视频网站在线观看| 国产精品久久9| 成人国产精品久久| 高清一区二区三区视频| 三级精品视频| 日韩av高清| 香蕉综合视频| 欧美极品少妇无套实战| 在线播放精品| av天堂永久资源网| 久久精品免费观看| 国产精品日日摸夜夜爽| 99久久国产综合精品女不卡| 亚洲人成人无码网www国产| 中文字幕制服丝袜成人av| 国内偷拍精品视频| 精品欧美一区二区三区| 成人免费一区二区三区| 欧美一级黄色录像| 十八禁一区二区三区| 原创国产精品91| av网址在线看| 国产91对白在线播放| 九九九精品视频| 国产精品视频在线免费观看| 国产一区二区三区天码| 亚洲av综合色区| 99视频一区| 爽爽爽在线观看| 91首页免费视频| 久久国产波多野结衣| 欧美性猛交xxxx富婆弯腰| 91国内精品视频| 亚洲经典中文字幕| 日本高清中文字幕在线| 隔壁老王国产在线精品| h1515四虎成人| 国产精品一级久久久| 日韩免费一区| 日韩视频第二页| 国产白丝网站精品污在线入口| 中文字幕人妻一区二区| 亚洲伦理在线精品| 久久国产乱子伦精品| 精品国产乱码久久久久久蜜臀| 国产大学生校花援交在线播放| 欧美另类第一页| 日韩制服一区| 久久av一区二区三区漫画| 亚洲欧美网站在线观看| 日韩精品一区二区三区色欲av| 国产suv一区二区三区88区| 久久久免费看片| 精品日本高清在线播放| 亚洲产国偷v产偷v自拍涩爱| 中文字幕日韩欧美在线 | 欧美日韩在线影院| 国产黄色片网站| 国产午夜精品免费一区二区三区| 波多野结依一区| 亚洲影视九九影院在线观看| 日本a级不卡| 91黄色小网站| 波多野结衣亚洲一区| 国产黄在线免费观看| 欧美在线观看18| 成人一区二区不卡免费| 欧美自拍视频在线| 国产精品17p| 成人小视频在线观看免费| 国产一区二区三区免费观看| 刘亦菲国产毛片bd| 欧美在线播放高清精品| 激情小说 在线视频| 国产91精品久久久久| 欧美a一欧美| 欧美成人免费在线观看视频| 懂色av一区二区三区免费观看| 免费中文字幕在线| 91精品国产综合久久久蜜臀图片 | 中文字幕不卡在线播放| 国产中文字幕视频| 亚洲美女av在线播放| 在线天堂资源| 欧美日韩一区二区三区在线观看免| 欧美亚洲一区| 草草影院第一页| 91国产免费观看| 国产一二三在线观看| 国产精品精品久久久久久| jizzjizz欧美69巨大| 日韩av片网站| 亚洲视频免费在线观看| 国产乱淫a∨片免费观看| 欧美成人手机在线| 136福利精品导航| a级黄色一级片| 91亚洲精品久久久蜜桃| 亚洲精品成人在线视频| 国产一级揄自揄精品视频| 岛国精品在线| 免费久久久久久| 国产a区久久久| 亚洲黄色小说图片| 国产一区二区三区视频| 日韩亚洲国产免费| 成人午夜视频免费观看| 99视频精品在线| 久久精品久久久久久久| 综合网中文字幕| 老司机亚洲精品一区二区| 欧美日韩一道本| 国产欧美精品一区| 国产精品爽爽久久| 国模视频一区二区| 国产欧美高清视频在线| 99视频在线观看视频| 天天av天天翘天天综合网| 成年人视频在线观看免费| 91网在线免费观看| 一本色道精品久久一区二区三区 | 一卡二卡欧美日韩| 日韩av地址| 91免费在线视频| 亚洲毛片在线| 国产一区在线观看免费| 精品国产91洋老外米糕| 亚洲综合在线电影| 9191国产视频| 久久久国产午夜精品| 国产乱淫a∨片免费视频| 2019最新中文字幕| 婷婷丁香综合| 欧美狂猛xxxxx乱大交3| 884aa四虎影成人精品一区| 蜜桃视频在线观看免费视频| 亚洲mv在线看| 99视频精品全部免费在线| 国产精品九九九九| 日本a级片电影一区二区|