☆技術(shù)問答集錦(15)JVM內(nèi)存模型

1 JVM組成結(jié)構(gòu)?

JVM組成結(jié)構(gòu)

JVM = 類加載器(classloader) + 執(zhí)行引擎(execution engine) + 運行時數(shù)據(jù)區(qū)域(runtime data area)

2 JVM運行時數(shù)據(jù)區(qū)域岩睁?

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

3 什么是程序計數(shù)器钞脂?

  1. 當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器
  2. 線程私有捕儒,生命周期與線程相同冰啃;
  3. 在虛擬機的概念模型里邓夕,字節(jié)碼解釋器工作時就是 通過改變這個計數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令,如:分支阎毅、循環(huán)焚刚、跳轉(zhuǎn)、異常處理扇调、線程恢復(fù)(多線程切換)等基礎(chǔ)功能矿咕;
  4. 如果線程正在執(zhí)行的是一個Java方法,這個計數(shù)器記錄的是正在執(zhí)行的虛擬機字節(jié)碼指令的地址狼钮;如果正在執(zhí)行的是Natvie方法痴腌,這個計數(shù)器值則為空(undefined);
  5. 程序計數(shù)器中存儲的數(shù)據(jù)所占空間的大小不會隨程序的執(zhí)行而發(fā)生改變燃领,所以此區(qū)域不會出現(xiàn)OutOfMemoryError的情況

4 什么是虛擬機棧锦援?

  1. 描述的是Java方法執(zhí)行的內(nèi)存模型猛蔽,每個方法被執(zhí)行的時候都會同時創(chuàng)建一個 棧幀(Stack Frame) 用于存儲 局部變量表、操作棧灵寺、動態(tài)鏈接曼库、方法出口 等信息。每一個方法被調(diào)用直至執(zhí)行完成的過程略板,就對應(yīng)著一個棧幀在虛擬機棧中從入棧到出棧的過程毁枯。
  2. 線程私有,生命周期與線程相同叮称;
  3. 局部變量表存放了編譯期可知的各種基本數(shù)據(jù)類型(boolean种玛、byte、char瓤檐、short赂韵、int、float挠蛉、long祭示、double)、對象引用(reference類型)谴古;它不等同于對象本身质涛,根據(jù)不同的虛擬機實現(xiàn),它可能是一個指向?qū)ο笃鹗嫉刂返囊弥羔橁#部赡苤赶蛞粋€代表對象的句柄或者其他與此對象相關(guān)的位置)和returnAddress類型(指向了一條字節(jié)碼指令的地址)汇陆。局部變量表所需的內(nèi)存空間在編譯期間完成分配,當(dāng)進入一個方法時恩敌,這個方法需要在棧幀中分配多大的局部變量空間是完全確定的瞬测,在方法運行期間不會改變局部變量表的大小
  4. 該區(qū)域可能拋出以下異常:
    1. 當(dāng)線程請求的棧深度超過最大值,會拋出 StackOverflowError 異常月趟;
    2. 棧進行動態(tài)擴展時如果無法申請到足夠內(nèi)存灯蝴,會拋出 OutOfMemoryError 異常;

5 什么是本地方法棧孝宗?

  1. 為虛擬機使用到的 Native 方法服務(wù)穷躁;
  2. 線程私有,生命周期與線程相同因妇;
  3. 虛擬機規(guī)范中對本地方法棧中的方法使用的語言问潭、使用的方式與數(shù)據(jù)結(jié)構(gòu)并沒有強制規(guī)定,因此具體的虛擬機可以自由實現(xiàn)它婚被。甚至有的虛擬機(譬如Sun HotSpot 虛擬機)直接就把本地方法棧和虛擬機棧合二為一狡忙;
  4. 與虛擬機棧一樣,本地方法棧區(qū)域也會拋出StackOverflowError和OutOfMemoryError異常址芯;

6 什么是堆灾茁?

  1. 在虛擬機啟動時創(chuàng)建,用來存放對象實例谷炸,幾乎所有的對象實例都在這里分配內(nèi)存北专;
  2. 被所有線程共享;
  3. Java堆是垃圾收集器管理的主要區(qū)域旬陡,因此很多時候也被稱做“GC堆”拓颓。如果從內(nèi)存回收的角度看,由于現(xiàn)在收集器基本都是 采用的分代收集算法描孟,所以Java堆中還可以細(xì)分為:新生代和老年代驶睦;新生代又有Eden空間、From Survivor空間画拾、To Survivor空間三部分啥繁;
  4. Java 堆不需要連續(xù)內(nèi)存,并且可以通過動態(tài)增加其內(nèi)存青抛,增加失敗會拋出 OutOfMemoryError 異常旗闽;
JVM堆參數(shù)示意

7 什么是方法區(qū)?

  1. 用于存放 已被加載的類信息蜜另、常量适室、靜態(tài)變量、即時編譯器編譯后的代碼 等數(shù)據(jù)举瑰;
  2. 被所有線程共享捣辆;
  3. 對這塊區(qū)域進行垃圾回收的主要目標(biāo)是 對常量池的回收和對類的卸載,但是一般比較難實現(xiàn)此迅,HotSpot 虛擬機把它當(dāng)成永久代(Permanent Generation)來進行垃圾回收汽畴;
  4. Java 堆一樣不需要連續(xù)的內(nèi)存旧巾,并且可以動態(tài)擴展,動態(tài)擴展失敗一樣會拋出 OutOfMemoryError 異常忍些;

8 什么是運行時常量池鲁猩?

  1. 運行時常量池是方法區(qū)的一部分;
  2. Class 文件中的常量池(編譯器生成的各種字面量和符號引用)會在類加載時被放入這個區(qū)域罢坝;
  3. 除了 在編譯期生成的常量廓握,還允許動態(tài)生成,例如 String 類的 intern()嘁酿。這部分常量也會被放入運行時常量池隙券;

在 JDK1.7之前,HotSpot 使用永久代實現(xiàn)方法區(qū)闹司;HotSpot 使用 GC 分代實現(xiàn)方法區(qū)帶來了很大便利娱仔;

從 JDK1.7 開始 HotSpot 開始移除永久代。其中符號引用(Symbols)被移動到 Native Heap中游桩,字符串常量和類引用被移動到 Java Heap中拟枚。

在 JDK1.8 中,永久代已完全被元空間(Meatspace)所取代众弓。元空間的本質(zhì)和永久代類似,都是對JVM規(guī)范中方法區(qū)的實現(xiàn)隔箍。不過元空間與永久代之間最大的區(qū)別在于:元空間并不在虛擬機中谓娃,而是使用本地內(nèi)存。因此蜒滩,默認(rèn)情況下滨达,元空間的大小僅受本地內(nèi)存限制

9 什么是直接內(nèi)存俯艰?

  1. 直接內(nèi)存(Direct Memory)并不是虛擬機運行時數(shù)據(jù)區(qū)的一部分捡遍,也不是Java虛擬機規(guī)范中定義的內(nèi)存區(qū)域,但是這部分內(nèi)存也被頻繁地使用竹握,而且也可能導(dǎo)致OutOfMemoryError 異常出現(xiàn)画株。
  2. 在 JDK 1.4 中新加入了 NIO 類,引入了一種基于通道(Channel)與緩沖區(qū)(Buffer)的 I/O方式啦辐,它可以 使用 Native 函數(shù)庫直接分配堆外內(nèi)存谓传,然后通過一個存儲在 Java 堆里的 DirectByteBuffer 對象作為這塊內(nèi)存的引用進行操作。這樣能在一些場景中顯著提高性能芹关,因為避免了在Java 堆和 Native 堆中來回復(fù)制數(shù)據(jù)续挟。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市侥衬,隨后出現(xiàn)的幾起案子诗祸,更是在濱河造成了極大的恐慌跑芳,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件直颅,死亡現(xiàn)場離奇詭異博个,居然都是意外死亡,警方通過查閱死者的電腦和手機际乘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門坡倔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人脖含,你說我怎么就攤上這事罪塔。” “怎么了养葵?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵征堪,是天一觀的道長。 經(jīng)常有香客問我关拒,道長佃蚜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任着绊,我火速辦了婚禮谐算,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘归露。我一直安慰自己洲脂,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布剧包。 她就那樣靜靜地躺著恐锦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疆液。 梳的紋絲不亂的頭發(fā)上一铅,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音堕油,去河邊找鬼潘飘。 笑死,一個胖子當(dāng)著我的面吹牛掉缺,可吹牛的內(nèi)容都是我干的福也。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼攀圈,長吁一口氣:“原來是場噩夢啊……” “哼暴凑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赘来,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤现喳,失蹤者是張志新(化名)和其女友劉穎凯傲,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗦篱,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡冰单,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了灸促。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诫欠。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖浴栽,靈堂內(nèi)的尸體忽然破棺而出荒叼,到底是詐尸還是另有隱情,我是刑警寧澤典鸡,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布被廓,位于F島的核電站,受9級特大地震影響萝玷,放射性物質(zhì)發(fā)生泄漏嫁乘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一球碉、第九天 我趴在偏房一處隱蔽的房頂上張望蜓斧。 院中可真熱鬧,春花似錦睁冬、人聲如沸法精。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至狼荞,卻和暖如春辽装,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背相味。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工拾积, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丰涉。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓拓巧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親一死。 傳聞我的和親對象是個殘疾皇子肛度,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

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

  • 文章轉(zhuǎn)自 http://blog.csdn.net/u012152619/article/details/4696...
    云狗狗狗狗狗閱讀 606評論 1 4
  • 內(nèi)存溢出和內(nèi)存泄漏的區(qū)別 內(nèi)存溢出:out of memory,是指程序在申請內(nèi)存時投慈,沒有足夠的內(nèi)存空間供其使用承耿,...
    Aimerwhy閱讀 741評論 0 1
  • Java虛擬機內(nèi)存模型 計劃發(fā)布3篇博客, 這是第一篇:jvm內(nèi)存模型 jvm內(nèi)存模型 對象創(chuàng)建和內(nèi)存分配 OOM...
    xuweizhen閱讀 462評論 0 2
  • Java虛擬機在執(zhí)行Java程序的過程中會把它所管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域冠骄。這些區(qū)域都有各自不同的用途,...
    join_a922閱讀 346評論 0 0
  • 第二部分 自動內(nèi)存管理機制 第二章 java內(nèi)存異常與內(nèi)存溢出異常 運行數(shù)據(jù)區(qū)域 程序計數(shù)器:當(dāng)前線程所執(zhí)行的字節(jié)...
    小明oh閱讀 1,164評論 0 2