JVM-內(nèi)存模型

前言

近幾個月學習了儒猿技術窩的專欄《從 0 開始帶你成為JVM實戰(zhàn)高手》后睁冬,基于課程講解的知識憾股,做了提煉乡数、歸納、擴展,整理出當前文章脆贵。

感謝專欄傳授的知識!專欄中從零開始,一步一圖的方式振坚,加上大量真實線上案例講解,讓我收獲很多斋扰。

一渡八、內(nèi)存區(qū)域整體介紹

1 JDK1.7至JDK1.8的內(nèi)存區(qū)域演變

image.png

主要改變

元數(shù)據(jù)空間取代了方法區(qū),方法區(qū)是在虛擬機中传货,而元數(shù)據(jù)空間在本地內(nèi)存中屎鳍。

2 JDK1.8內(nèi)存區(qū)域的詳細劃分

image.png

3.代碼執(zhí)行時的完整的流程

示例代碼

image.png

執(zhí)行流程

image.png

二、內(nèi)存區(qū)域劃分

1 方法區(qū)

JDK1.8以前叫方法區(qū)问裕,1.8以后叫"Metaspace"元數(shù)據(jù)空間.

(1)是否線程共享

線程共享辟拷。

(2)功能

存放已被虛擬機加載的類信息、常量掐隐、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)卖宠。

(3)JDK1.8的改動

JDK1.8后,元空間替換了永久代忧饭,

主要改動

  1. 元空間使用的是本地內(nèi)存扛伍,即不在JVM內(nèi)存區(qū)域中。

  2. 字符串常量由永久代轉移到堆中

  3. 和永久代相關的JVM參數(shù)已移除

可參考:

Metaspace 之一:Metaspace整體介紹(永久代被替換原因词裤、元空間特點刺洒、元空間內(nèi)存查看分析方法)【非常好的文章】

2 程序計數(shù)器

(1)線程是否共享

線程獨享

(2)功能

JAVA代碼會被翻譯成字節(jié)碼,對應各種字節(jié)碼指令吼砂。

如果線程正在執(zhí)行一個JAVA方法逆航,計數(shù)器記錄當前線程執(zhí)行到了哪一條字節(jié)碼指令;

如果是正在執(zhí)行的是Native方法渔肩,計數(shù)器的值為Undefined因俐。

此內(nèi)存區(qū)域是唯一一個在JAVA虛擬機規(guī)范中沒有規(guī)定任何OutOfMemoryError情況的區(qū)域。

3 JAVA虛擬機棧

3.1 整體介紹

(1) 是否線程共享

線程獨享

(2) 功能

每當線程啟動的時候周偎,就會分配一個Java虛擬機棧抹剩。

(3) JAVA虛擬機棧作用

執(zhí)行方法時,會給方法創(chuàng)建棧幀然后入棧栏饮,在棧幀里存放這個方法對應的局部變量之類的數(shù)據(jù)吧兔。

方法執(zhí)行完后,方法對應的棧幀從虛擬機棧中出棧袍嬉。(后面再深入學習入棧境蔼、出棧)

(4) 可能發(fā)生的錯誤

StackOverflowError: 線程請求的棧深度大于虛擬機所允許的深度,JDK1.8默認棧最大大小是1M伺通。

OutOfMemoryError: 如果虛擬機椆客粒可以動態(tài)擴展,而擴展時無法申請到足夠的內(nèi)存罐监。(后面再深入學這兩個Error)

3.1 棧幀

(1) 功能

線程執(zhí)行了一個方法吴藻,會對這個方法調(diào)用創(chuàng)建對應的一個棧幀

棧幀里包含這個方法的局部變量表弓柱、操作樹棧沟堡、動態(tài)鏈接、方法出口矢空。

局部變量表:存放了編譯期可知的各種基本類型(int航罗、float等)、對象引用(指向堆內(nèi)存的地址)屁药、returnAddress類型(指向了一條字節(jié)碼指令的地址)粥血。

示例代碼中main線程執(zhí)行時的虛擬機棧內(nèi)存情況:

image.png

4 JAVA堆內(nèi)存

(1) 是否線程共享

線程共享。

(2) 功能

主要存放對象實例和數(shù)組。

可以物理上不連續(xù)复亏,但邏輯上要連續(xù)趾娃。

局部變量表的局部變量指向堆內(nèi)存的對象:

image.png

(3) 創(chuàng)建的對象在堆內(nèi)存中占用多少內(nèi)存?

一個對象對堆內(nèi)存空間的占用缔御,大致分為兩塊:

(1)對象自己本身的一些信息

比如對象頭抬闷,在64位的Linux操作系統(tǒng)上,會占用16個字節(jié)刹淌。

(2)對象的實例變量作為數(shù)據(jù)占用的空間

各個實例變量占用的內(nèi)存饶氏,例如int類型占用4個字節(jié)讥耗,long類型占用8個字節(jié)有勾。還有數(shù)組、Map之類的會占用更多內(nèi)存古程。

5 本地方法棧

5.1 整體介紹

(1) 是否線程共享

線程獨享

(2) 功能

本地方法棧是為虛擬機使用到的Native方法服務蔼卡。Java虛擬機棧是為執(zhí)行Java方法(也就是字節(jié)碼)服務。

(3) 可能發(fā)生的錯誤

和虛擬機棧一樣挣磨,也會有StackOverflowError和OutOfMemoryError錯誤雇逞。

6 直接內(nèi)存

(1) 是否線程共享

線程共享

(2) 功能

為虛擬機運行時數(shù)據(jù)區(qū)的部分。

在JDK1.4中新加入NIO(New Input/Output)類茁裙,引入了一種基于通道(Channel)和緩存(Buffer)的I/O方式塘砸,它可以使用Native函數(shù)庫直接分配堆外內(nèi)存,然后通過一個存儲在Java堆中的DirectByteBuffer對象作為這塊內(nèi)存的引用進行操作晤锥。
Netty框架就是使用了直接內(nèi)存掉蔬。

(3) 作用

可以避免在Java堆和Native堆中來回的耗時操作。

(4) 可能發(fā)生的錯誤

OutOfMemoryError: 會受到本機內(nèi)存限制矾瘾,如果內(nèi)存區(qū)域總和大于物理內(nèi)存限制從而導致動態(tài)擴展時出現(xiàn)該異常女轿。

參考:

Java虛擬機(JVM)你只要看這一篇就夠了! https://blog.csdn.net/qq_41701956/article/details/81664921

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末壕翩,一起剝皮案震驚了整個濱河市蛉迹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌放妈,老刑警劉巖北救,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異芜抒,居然都是意外死亡珍策,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門挽绩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膛壹,“玉大人,你說我怎么就攤上這事∧A” “怎么了肩民?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長链方。 經(jīng)常有香客問我持痰,道長,這世上最難降的妖魔是什么祟蚀? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任工窍,我火速辦了婚禮,結果婚禮上前酿,老公的妹妹穿的比我還像新娘患雏。我一直安慰自己,他們只是感情好罢维,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布淹仑。 她就那樣靜靜地躺著,像睡著了一般肺孵。 火紅的嫁衣襯著肌膚如雪匀借。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天平窘,我揣著相機與錄音吓肋,去河邊找鬼。 笑死瑰艘,一個胖子當著我的面吹牛是鬼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播磅叛,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼屑咳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了弊琴?” 一聲冷哼從身側響起兆龙,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎敲董,沒想到半個月后紫皇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡腋寨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年聪铺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萄窜。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡铃剔,死狀恐怖撒桨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情键兜,我是刑警寧澤凤类,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站普气,受9級特大地震影響谜疤,放射性物質發(fā)生泄漏。R本人自食惡果不足惜现诀,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一夷磕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧仔沿,春花似錦坐桩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陡鹃。三九已至烘浦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間萍鲸,已是汗流浹背闷叉。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留脊阴,地道東北人握侧。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像嘿期,于是被迫代替她去往敵國和親品擎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

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

  • 1 CPU和內(nèi)存的交互 了解jvm內(nèi)存模型前备徐,了解下cpu和計算機內(nèi)存的交互情況萄传。【因為Java虛擬機內(nèi)存模型定義...
    Zal哥哥閱讀 246評論 0 2
  • 1 CPU和內(nèi)存的交互 了解jvm內(nèi)存模型前蜜猾,了解下cpu和計算機內(nèi)存的交互情況秀菱。【因為Java虛擬機內(nèi)存模型定義...
    Garwer閱讀 367,485評論 54 549
  • 如圖: 運行時數(shù)據(jù)區(qū)主要有 5個核心區(qū)蹭睡;又根據(jù)是否線程私有分為兩部分 線程私有:方法區(qū)(含有運行時常量池)衍菱、堆 線...
    小碼毅閱讀 124評論 0 0
  • 1,程序計數(shù)器 1.1 用于存儲每個線程下一步將執(zhí)行的jvm指令 1.2 如該方法是Native的肩豁,則不存儲任何信...
    lqq2019閱讀 302評論 0 0
  • 2脊串、Java內(nèi)存區(qū)域與Java內(nèi)存模型 1)Java內(nèi)存區(qū)域 Java虛擬機在運行程序時會把其自動管理的內(nèi)存劃分為...
    脆皮雞大蝦閱讀 854評論 0 2