【017期】JavaSE面試題(十七):JVM之內(nèi)存模型

開篇介紹

大家好橄仆,我是Java最全面試題庫的提褲姐妙色,今天這篇是面試系列的第十七篇,主要總結(jié)了JavaSE中JVM相關(guān)面試題僧著,這篇是JVM系列的第一篇,主要講解JVM的內(nèi)存模型障簿,第二篇主要講解垃圾回收盹愚。在后續(xù),會沿著第一篇開篇的知識線路一直總結(jié)下去站故,做到日更皆怕!如果我能做到百日百更毅舆,希望你也可以跟著百日百刷,一百天養(yǎng)成一個好習慣愈腾。

JVM內(nèi)存.png

說一下JVM內(nèi)存模型及分區(qū)憋活,每個區(qū)放什么?

JVM分為:

  • 堆區(qū)
  • 棧區(qū)
  • 方法區(qū)

①方法區(qū):主要是存儲類信息虱黄,常量池(static量和 static變量)悦即,編譯后的代碼(字節(jié)碼)等數(shù)據(jù)
②堆:初始化的對象,成員變量(那種非 static的變量)橱乱,所有的對象實例和數(shù)組都要在堆上分配
③棧:棧的結(jié)構(gòu)是棧幀組成的辜梳,調(diào)用一個方法就壓入一幀,幀上面存儲局部變量表泳叠,操作數(shù)棧作瞄,方法出口等信息,局部變量表存放的是8大基礎類型加上一個引用類型析二,所以還是一個指向地址的指針
④本地方法棧:主要為 Native方法服務
⑤程序計數(shù)器:記錄當前線程執(zhí)行的行號

總結(jié):初始化的對象放在堆里面粉洼,引用放在棧里面,class類信息常量池(static常量和 static變量)等放在方法區(qū)

JVM內(nèi)存區(qū)域主要分為:

  • 線程私有區(qū)(程序計數(shù)器叶摄、虛擬機棧属韧、本地方法區(qū))
  • 線程共享區(qū)(Java堆、方法區(qū))
  • 直接內(nèi)存
image.png

說一下Java內(nèi)存分配

  • 寄存器:無法控制蛤吓。
  • 靜態(tài)域: static定義的靜態(tài)成員宵喂。
  • 常量池:編譯時被確定并保存在. class文件中的final常量值和一些文本修飾的符號引用(類和接口的全限定名,字段的名稱和描述符,方法和名稱和描述符)。
  • 非RAM存儲:硬盤等永久存儲空間会傲。
  • 堆內(nèi)存:new創(chuàng)建的對象和數(shù)組,由Java虛擬機自動垃圾回收器管理,存取速度慢锅棕。
  • 棧內(nèi)存:基本類型的變量和對象的引用變量(堆內(nèi)存空間的訪問地址),速度快,可以共享,但是大小與生存期必須確定,缺乏靈活性。

新生代中為什么要分為Eden和Survivor淌山?

如果沒有Survivor裸燎,Eden區(qū)每進行一次Minor GC,存活的對象就會被送到老年代泼疑。老年代很快被填滿德绿,觸發(fā)Major GC.老年代的內(nèi)存空間遠大于新生代,進行一次Full GC消耗的時間比Minor GC長得多,所以需要分為Eden和Survivor退渗。
Survivor的存在意義移稳,就是減少被送到老年代的對象,進而減少Full GC的發(fā)生会油,Survivor的預篩選保證个粱,只有經(jīng)歷16次Minor GC還能在新生代中存活的對象,才會被送到老年代翻翩。
設置兩個Survivor區(qū)最大的好處就是解決了碎片化都许,剛剛新建的對象在Eden中稻薇,經(jīng)歷一次Minor GC,Eden中的存活對象就會被移動到第一塊survivor space S0梭稚,Eden被清空颖低;等Eden區(qū)再滿了,就再觸發(fā)一次Minor GC弧烤,Eden和S0中的存活對象又會被復制送入第二塊survivor space S1(這個過程非常重要忱屑,因為這種復制算法保證了S1中來自S0和Eden兩部分的存活對象占用連續(xù)的內(nèi)存空間,避免了碎片化的發(fā)生)

對象如何晉升到老年代?

1暇昂、大對象直接進入老年態(tài)
2莺戒、經(jīng)過一次Minor GC,年齡+1急波,若年齡超過一定限制(15)从铲,則被晉升到老年態(tài)。即長期存活的對象進入老年態(tài)

元數(shù)據(jù)區(qū)存放的是什么澄暮?會oom嗎名段?

Perm Space中保存的是加載class文件

會引起OutOfMemory泣懊,出現(xiàn)異成毂伲可以設置 -XX:PermSize 的大小。

JDK 1.8后馍刮,字符串常量不存放在永久代信夫,而是在堆內(nèi)存中,JDK1.8以后沒有永久代概念卡啰,而是用元空間替代静稻,元空間不存在虛擬機中,二是使用本地內(nèi)存匈辱。

jvm加載class原理

JVM中類的裝載是由類加載器(ClassLoader)它的子類來實現(xiàn)的振湾,Java中的類加載器是一個重要的Java運行時系統(tǒng)組件,它負責在運行時查找和裝入類文件中的類亡脸。

由于Java的跨平臺性恰梢,經(jīng)過編譯的Java源程序并不是一個可執(zhí)行程序,而是一個或多個類文件梗掰。當Java程序需要使用某個類時,JVM會確保這個類已經(jīng)被加載嗅回、連接(驗證及穗、準備和解析)和初始化。

類的加載是指把類的.class文件中的數(shù)據(jù)讀入到內(nèi)存中绵载,通常是創(chuàng)建一個字節(jié)數(shù)組讀入.class文件埂陆,然后產(chǎn)生與所加載類對應的Class對象苛白。加載完成后,Class對象還不完整焚虱,所以此時的類還不可用购裙。當類被加載后就進入連接階段,這一階段包括驗證鹃栽、準備(為靜態(tài)變量分配內(nèi)存并設置默認的初始值)和解析(將符號引用替換為直接引用)三個步驟躏率。最后JVM對類進行初始化,包括:
①如果類存在直接的父類并且這個類還沒有被初始化民鼓,那么就先初始化父類薇芝;
②如果類中存在初始化語句,就依次執(zhí)行這些初始化語句丰嘉。類的加載是由類加載器完成的夯到,類加載器包括:根加載器(BootStrap)、擴展加載器(Extension)饮亏、系統(tǒng)加載器(System)和用戶自定義類加載器(java.lang.ClassLoader的子類)耍贾。從Java 2(JDK 1.2)開始,類加載過程采取了父親委托機制(PDM)路幸。PDM更好的保證了Java平臺的安全性荐开,在該機制中,JVM自帶的Bootstrap是根加載器劝赔,其他的加載器都有且僅有一個父類加載器誓焦。類的加載首先請求父類加載器加載,父類加載器無能為力時才由其子類加載器自行加載着帽。JVM不會向Java程序提供對Bootstrap的引用杂伟。

哪些區(qū)域可能會發(fā)生oom?

內(nèi)存區(qū)域 是否線程私有 是否會發(fā)生OOM
程序計數(shù)器
虛擬機棧
本地方法棧
方法區(qū)
直接內(nèi)存

Java堆的結(jié)構(gòu)是什么樣子的?

JVM的堆是運行時數(shù)據(jù)區(qū)仍翰,所有類的實例和數(shù)組都是在堆上分配內(nèi)存赫粥。
它在JVM啟動的時候被創(chuàng)建。
對象所占的堆內(nèi)存是由自動內(nèi)存管理系統(tǒng)也就是垃圾收集器回收予借。
堆內(nèi)存是由存活和死亡的對象組成的越平。
存活的對象是應用可以訪問的,不會被垃圾回收。
死亡的對象是應用不可訪問尚且還沒有被垃圾收集器回收掉的對象灵迫。
一直到垃圾收集器把這些對象回收掉之前,他們會一直占據(jù)堆內(nèi)存空間秦叛。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瀑粥,隨后出現(xiàn)的幾起案子挣跋,更是在濱河造成了極大的恐慌,老刑警劉巖狞换,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件避咆,死亡現(xiàn)場離奇詭異舟肉,居然都是意外死亡,警方通過查閱死者的電腦和手機查库,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門路媚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人樊销,你說我怎么就攤上這事整慎。” “怎么了现柠?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵院领,是天一觀的道長。 經(jīng)常有香客問我够吩,道長比然,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任周循,我火速辦了婚禮强法,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘湾笛。我一直安慰自己饮怯,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布嚎研。 她就那樣靜靜地躺著蓖墅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪临扮。 梳的紋絲不亂的頭發(fā)上论矾,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音杆勇,去河邊找鬼贪壳。 笑死,一個胖子當著我的面吹牛蚜退,可吹牛的內(nèi)容都是我干的闰靴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼钻注,長吁一口氣:“原來是場噩夢啊……” “哼蚂且!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起幅恋,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤膘掰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體识埋,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年零渐,在試婚紗的時候發(fā)現(xiàn)自己被綠了窒舟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡诵盼,死狀恐怖惠豺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情风宁,我是刑警寧澤洁墙,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站戒财,受9級特大地震影響热监,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜饮寞,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一孝扛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧幽崩,春花似錦苦始、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蹄溉,卻和暖如春咨油,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背类缤。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工臼勉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人餐弱。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓宴霸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親膏蚓。 傳聞我的和親對象是個殘疾皇子瓢谢,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354