《深入理解Java虛擬機》讀書筆記1--Java內(nèi)存區(qū)域

《深入理解Java虛擬機》是我個人讀過的第一本關于JVM方面的書籍利职。十分有幸能夠讀到這本書趣效,在此對作者表示深刻的敬意

不知道有沒有人和我一樣有類似的情況,就是一本書讀完眼耀,經(jīng)過一段時間之后英支,林林總總最后留在腦子里的并不多,很多東西又還給了作者哮伟。有人可能會說干花,之所以會遺忘,是因為你根本沒有理解楞黄。我并不否認這點池凄,說實話,很多書讀過一遍之后都會存在沒有讀懂的部分鬼廓。但是隨著我們閱歷的豐富以及期間不斷的學習肿仑,過去不懂的部分終究會慢慢讀懂。鑒于這種情況,我覺得讀書筆記還是很有必要:讀書期間總結(jié)歸納尤慰,日后溫故知新

筆記僅僅是我個人對此書的一份總結(jié)馏锡,提綱挈領。如需了解細節(jié)伟端,請完整閱讀原著杯道,這本書我個人也強烈推薦。下面责蝠,開始《深入理解Java虛擬機》讀書筆記的第一篇--Java內(nèi)存區(qū)域

運行時數(shù)據(jù)區(qū)域

JVM在運行Java程序時將內(nèi)存區(qū)域劃分為不同的部分党巾,這些區(qū)域有各自的用途以及各自的內(nèi)存管理策略

在Java虛擬機的概念模型中,這些區(qū)域大致可以分為:程序計數(shù)器(Program Counter Register)霜医、虛擬機棧(VM Stack)齿拂、本地方法棧(Native Method Stack)、堆(Heap)肴敛、方法區(qū)(Method Area)

其中前三者是線程隔離的內(nèi)存區(qū)域署海,后兩者是線程共享的內(nèi)存區(qū)域

1.程序計數(shù)器

程序計數(shù)器可以簡單理解為線程執(zhí)行字節(jié)碼的行號指示器。由于在線程切換后需要恢復到程序的執(zhí)行位置医男,因此每個線程都有各自的程序計數(shù)器

2.虛擬機棧

虛擬機棧描述的是Java方法執(zhí)行的內(nèi)存模型叹侄,方法在執(zhí)行的時候會創(chuàng)建棧幀。棧幀用于存儲方法執(zhí)行時所需的局部變量表昨登、操作數(shù)棧、動態(tài)鏈接贯底、方法出口等信息丰辣。方法的執(zhí)行伴隨著棧幀在虛擬機棧中的入棧及出棧

局部變量表存儲了基本數(shù)據(jù)類型、對象引用禽捆、返回地址

Java虛擬機規(guī)范對此區(qū)域規(guī)定了兩種異常情況:當線程請求的棧深度大于虛擬機允許的最大深度將觸發(fā)StackOverflowError笙什;如果虛擬機棧在動態(tài)擴展時無法申請到足夠的內(nèi)存將觸發(fā)OutOfMemoryError

3.本地方法棧

本地方法棧與虛擬機棧作用類似,區(qū)別在于虛擬機棧用于Java方法執(zhí)行胚想,而本地方法棧用于本地方法執(zhí)行

有些虛擬機甚至不區(qū)分本地方法棧和虛擬機棧琐凭,而是將它們合二為一

同樣本地方法棧也會觸發(fā)StackOverflowError和OutOfMemoryError

4.堆

堆用于存放對象實例,可以細分為新生代和老年代浊服,進一步可以細分為Eden空間统屈、From Survivor空間、To Survivor空間等牙躺。進一步細分區(qū)域的目的是根據(jù)對象的特征更好的分配以及回收內(nèi)存空間

堆在物理上可以是不連續(xù)的空間愁憔,只要在邏輯上是連續(xù)的即可。如果當前堆內(nèi)存已經(jīng)用完并且無法動態(tài)擴展的時候會觸發(fā)OutOfMemoryError

5.方法區(qū)

方法區(qū)主要用于存放已經(jīng)被虛擬機加載的類信息孽拷、常量吨掌、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)

運行時常量池是方法區(qū)的一部分,主要用于存放編譯期生成的字面量和符號引用膜宋,另外在運行時也可以將新的常量加入池中

這個區(qū)域的內(nèi)存回收通常收益較低窿侈,主要是針對常量池的回收以及對類型的卸載(對類型卸載的要求十分嚴苛)

同樣,當方法區(qū)無法滿足內(nèi)存分配需求時秋茫,將會觸發(fā)OutOfMemoryError

6.直接內(nèi)存

直接內(nèi)存并非Java虛擬機規(guī)范中定義的內(nèi)存區(qū)域史简,但是在大量使用NIO的程序中有可能觸發(fā)OutOfMemoryError異常

NIO基于Channel和Buffer,可以直接使用本地方法分配堆外內(nèi)存学辱,然后通過存儲在堆中的DirectByteBuffer對象作為這塊堆外內(nèi)存的引用進行操作乘瓤。雖然堆外內(nèi)存不會受到Java堆大小的限制,但是仍然會受制于物理內(nèi)存以及操作系統(tǒng)的限制策泣。當各內(nèi)存區(qū)域總和大于物理內(nèi)存或者達到操作系統(tǒng)限制衙傀,從而導致動態(tài)擴展時觸發(fā)OutOfMemoryError

對象探秘

不同的虛擬機,對于對象的創(chuàng)建萨咕、布局和訪問會有所差異统抬,下面僅以HotSpot的堆內(nèi)存為例進行介紹

1.對象的創(chuàng)建

#類檢查及類加載

虛擬機在遇到new指令的時候,首先會去常量池檢查類的符號引用危队,如果發(fā)現(xiàn)沒有對此類進行加載聪建、解析厕怜、初始化绑莺,那么首先會對該類進行加載

#內(nèi)存分配

之后虛擬機會為該對象分配內(nèi)存。由于對象所需內(nèi)存在類加載后就可以確定览妖,因此分配內(nèi)存實際上就是從未使用的堆內(nèi)存中劃分出一塊確定大小的存儲空間簿盅。此過程有兩種方式:

1)對于規(guī)整的堆內(nèi)存挥下,直接將指針向空閑一側(cè)移動所需的大小,這種方式叫做“指針碰撞”

2)對于不規(guī)整對堆內(nèi)存桨醋,虛擬機會維護一個空閑內(nèi)存列表棚瘟,當需要分配內(nèi)存時,劃分出一塊足夠的空間并且更新空閑列表喜最,這種方式叫做“空閑列表”

至于堆內(nèi)存是否規(guī)整連續(xù)偎蘸,取決于具體的垃圾收集器(主要取決于是否帶有compact功能)

由于對象的創(chuàng)建是一個十分頻繁的過程,在并發(fā)情況下會有并發(fā)安全的問題瞬内。解決的方式有兩種:

1)對內(nèi)存分配進行同步處理迷雪,實際上虛擬機采用CAS的方式保證原子性

2)另一種方式是把內(nèi)存分配的動作按照線程進行隔離,即每個線程會預先分配一小塊內(nèi)存虫蝶,稱為本地線程分配緩沖(Thread Local Allocation Buffer振乏,TLAB)。只有在TLAB用完需要新分配的時候在采取同步處理

#初始化零值

內(nèi)存分配完畢后秉扑,虛擬機會對該內(nèi)存區(qū)域初始化零值慧邮,如果是TLAB方式调限,這一步可以提前到TLAB階段。這一步保證了對象實例屬性的初始化误澳。這也就是為什么對象的實例屬性可以不賦初值就能夠直接訪問

#對象頭設置

接下來耻矮,虛擬機需要將對象進行一些設置,將類的元數(shù)據(jù)忆谓、哈希碼裆装、GC分代信息等設置到對象頭中

#對象初始化

執(zhí)行完上述步驟后,對象的實例屬性還都是零值倡缠,下面會執(zhí)行<init>方法哨免,按照程序的意圖對對象進行初始化(我的理解是執(zhí)行構(gòu)造方法)。之后在將對象的引用入棧昙沦。至此琢唾,對象的創(chuàng)建過程結(jié)束

2.對象的內(nèi)存布局

在HotSpot虛擬機當中,對象的內(nèi)存布局分為三個區(qū)域:對象頭盾饮、實例數(shù)據(jù)采桃、對齊填充

#對象頭

對象頭主要存儲兩部分信息,一部分是對象的運行時數(shù)據(jù)(如哈希碼丘损、GC分代信息普办、鎖狀態(tài)標志、線程持有的鎖徘钥、偏向線程ID衔蹲、偏向時間戳等),另一部分是類型指針(即指向類元數(shù)據(jù)的指針呈础,代表該對象是哪個類的實例踪危。當然類的元數(shù)據(jù)也并不一定要存儲在對象頭,這個后續(xù)再討論)

#實例數(shù)據(jù)

實例數(shù)據(jù)部分用于存儲對象實例的數(shù)據(jù)猪落,即實例屬性的內(nèi)容,父類的屬性也會記錄下來畴博。存儲順序會受到虛擬機的分配策略以及字段的定義順序的影響笨忌。默認的分配策略大致有幾點規(guī)則:

1)會將相同寬度的屬性分配在一起

2)滿足1的前提下,父類中的屬性出現(xiàn)在子類前

3)CompactFields參數(shù)為true的時候俱病,會將子類中寬度較窄的屬性插入到父類屬性的空隙之中

#對齊填充

由于HotSpot虛擬機要求對象的其實地址必須是8字節(jié)的整數(shù)倍官疲,因此對于對象大小不是8字節(jié)整數(shù)倍的對象,會被對齊填充

3.對象的訪問定位

對象的訪問解決的是如何通過棧中對象的引用訪問到堆中實際對象的問題亮隙,目前主流的方式有兩種:

1)句柄訪問途凫,棧中對象的引用存儲的是對象的句柄地址(句柄在句柄池中維護),句柄存儲了堆中對象實例的地址以及方法區(qū)中對象的類型數(shù)據(jù)的地址溢吻。

這種方式的優(yōu)點是引用中存儲的是穩(wěn)定的句柄维费,當對象地址變化的時候(GC過程中可能會移動對象實例)果元,只需要更新句柄,不需要更新引用犀盟;缺點也顯而易見而晒,訪問對象時多一次指針操作

2)直接指針訪問,棧中對象的引用存儲的就是對象實例的地址阅畴,對象實例(對象頭)中又存儲了方法區(qū)中對象的類型數(shù)據(jù)的地址

這種方式的優(yōu)點就是訪問迅速(比前者少一次指針操作)倡怎,在HotSpot虛擬機中采用此種方式

思維導圖:

筆記1結(jié)束

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市贱枣,隨后出現(xiàn)的幾起案子监署,更是在濱河造成了極大的恐慌,老刑警劉巖纽哥,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钠乏,死亡現(xiàn)場離奇詭異,居然都是意外死亡昵仅,警方通過查閱死者的電腦和手機缓熟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摔笤,“玉大人够滑,你說我怎么就攤上這事÷朗溃” “怎么了彰触?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長命辖。 經(jīng)常有香客問我况毅,道長,這世上最難降的妖魔是什么尔艇? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任尔许,我火速辦了婚禮,結(jié)果婚禮上终娃,老公的妹妹穿的比我還像新娘味廊。我一直安慰自己,他們只是感情好棠耕,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布余佛。 她就那樣靜靜地躺著,像睡著了一般窍荧。 火紅的嫁衣襯著肌膚如雪辉巡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天蕊退,我揣著相機與錄音郊楣,去河邊找鬼憔恳。 笑死,一個胖子當著我的面吹牛痢甘,可吹牛的內(nèi)容都是我干的喇嘱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼塞栅,長吁一口氣:“原來是場噩夢啊……” “哼者铜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起放椰,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤作烟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后砾医,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拿撩,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年如蚜,在試婚紗的時候發(fā)現(xiàn)自己被綠了压恒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡错邦,死狀恐怖探赫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情撬呢,我是刑警寧澤伦吠,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站魂拦,受9級特大地震影響毛仪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芯勘,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一箱靴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荷愕,春花似錦衡怀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茄靠。三九已至茂契,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間慨绳,已是汗流浹背掉冶。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工真竖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人厌小。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓恢共,卻偏偏與公主長得像,于是被迫代替她去往敵國和親璧亚。 傳聞我的和親對象是個殘疾皇子讨韭,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 就在昨天,老媽和我微信視頻癣蟋,說:聽說你買了一輛車透硝。可不是嗎疯搅?我終于買了一輛自行車濒生。哈哈哈哈,兩人不約大笑幔欧。 我買了...
    木木木俠閱讀 956評論 0 4
  • 金燦燦的玉米囤滿農(nóng)家的庭院 紅通通的小棗晾曬在屋前院后 黑黝黝的豆兒裝好袋子聚在屋檐下 豐收罪治!今年的秋,農(nóng)家院落顯...
    豐盈倉廩閱讀 839評論 0 0
  • 寒風凜冽,寒氣襲人,枯草蕭疏,綠色盡失,今年的冬天如此蒼白凄涼且冷漠. M點燃一支煙,吞云吐霧起來瘦麸,一圈圈的煙霧谁撼,...
    幽谷泉涌閱讀 854評論 0 1
  • 01 大熊和小琪是大學同學,也是我認識的人里滋饲,唯一一對畢業(yè)季在一起厉碟,結(jié)果談了三年異地戀的戀人。 上周末屠缭,大熊還是失...
    子小洛閱讀 3,811評論 47 61