萬萬沒想到,面試官把JVM內(nèi)存結(jié)構(gòu)問的這么難呻拌?

金九銀十就要到了葱轩,準(zhǔn)備跳槽的小伙伴們都準(zhǔn)備的怎么樣了?是對(duì)所有的技術(shù)點(diǎn)稍微的了解淺層還是說刨根到底了藐握,小伙伴們?nèi)绻X得自己掌握的很深了

那么靴拱,請(qǐng)大家嘗試著回答一下以下問題:

1、JVM管理的內(nèi)存結(jié)構(gòu)是怎樣的猾普?
2袜炕、不同的虛擬機(jī)在實(shí)現(xiàn)運(yùn)行時(shí)內(nèi)存的時(shí)候有什么區(qū)別?
3初家、運(yùn)行時(shí)數(shù)據(jù)區(qū)中哪些區(qū)域是線程共享的偎窘?哪些是獨(dú)享的?
4溜在、除了JVM運(yùn)行時(shí)內(nèi)存以外陌知,還有什么區(qū)域可以用嗎?
5掖肋、堆和棧的區(qū)別是什么仆葡?
6、Java中的數(shù)組是存儲(chǔ)在堆上還是棧上的培遵?
7浙芙、Java中的對(duì)象創(chuàng)建有多少種方式?
8籽腕、Java中對(duì)象創(chuàng)建的過程是怎么樣的嗡呼?
9、Java中的對(duì)象一定在堆上分配內(nèi)存嗎皇耗?
10南窗、如何獲取堆和棧的dump文件?

以上10道題郎楼,如果您可以全部準(zhǔn)確無誤的回答的話万伤,那說明你真的很了解JVM的內(nèi)存結(jié)構(gòu)以及內(nèi)存分配相關(guān)的知識(shí)了,如果有哪些知識(shí)點(diǎn)是不了解的呜袁,那么本文正好可以幫你答疑解惑敌买。

JVM管理的內(nèi)存結(jié)構(gòu)是怎樣的?

Java虛擬機(jī)在執(zhí)行Java程序的過程中會(huì)把他所管理的內(nèi)存劃分為若干個(gè)不同的數(shù)據(jù)區(qū)域阶界『缗ィ《Java虛擬機(jī)規(guī)范》中規(guī)定了JVM所管理的內(nèi)存需要包括一下幾個(gè)運(yùn)行時(shí)區(qū)域:

主要包含了PC寄存器(程序計(jì)數(shù)器)、Java虛擬機(jī)棧膘融、本地方法棧芙粱、Java堆、方法區(qū)以及運(yùn)行時(shí)常量池氧映。

各個(gè)區(qū)域有各自不同的作用春畔,關(guān)于各個(gè)區(qū)域的作用就不在本文中相信介紹了。

但是岛都,需要注意的是律姨,上面的區(qū)域劃分只是邏輯區(qū)域,對(duì)于有些區(qū)域的限制是比較松的疗绣,所以不同的虛擬機(jī)廠商在實(shí)現(xiàn)上线召,甚至是同一款虛擬機(jī)的不同版本也是不盡相同的。

不同的虛擬機(jī)在實(shí)現(xiàn)運(yùn)行時(shí)內(nèi)存的時(shí)候有什么區(qū)別多矮?

前面提到過《Java虛擬機(jī)規(guī)范》定義的JVM運(yùn)行時(shí)所需的內(nèi)存區(qū)域缓淹,不同的虛擬機(jī)實(shí)現(xiàn)上有所不同,而在這么多區(qū)域中塔逃,規(guī)范對(duì)于方法區(qū)的管理是最寬松的讯壶,規(guī)范中關(guān)于這部分的描述如下:

方法區(qū)在虛擬機(jī)啟動(dòng)的時(shí)候創(chuàng)建,雖然方法區(qū)是堆的邏輯組成部分湾盗,但是簡(jiǎn)單的虛擬機(jī)實(shí)現(xiàn)可以選擇在這個(gè)區(qū)域不實(shí)現(xiàn)垃圾收集與壓縮伏蚊。本版本的規(guī)范也不限定實(shí)現(xiàn)方法區(qū)的內(nèi)存位置和代碼編譯的管理策略。方法區(qū)的容量可以是固定的格粪,也可以隨著程序執(zhí)行的需求動(dòng)態(tài)擴(kuò)展躏吊,并在不需要過多的空間時(shí)自行收縮氛改。方法區(qū)在實(shí)際內(nèi)存空間站可以是不連續(xù)的。

這一規(guī)定比伏,可以說是給了虛擬機(jī)廠商很大的自由胜卤。

虛擬機(jī)規(guī)范對(duì)方法區(qū)實(shí)現(xiàn)的位置并沒有明確要求,在最著名的HotSopt虛擬機(jī)實(shí)現(xiàn)中(在Java 8 之前)赁项,方法區(qū)僅是邏輯上的獨(dú)立區(qū)域葛躏,在物理上并沒有獨(dú)立于堆而存在,而是位于永久代中悠菜。所以舰攒,這時(shí)候方法區(qū)也是可以被垃圾回收的。

實(shí)踐證明悔醋,JVM中存在著大量的聲明短暫的對(duì)象摩窃,還有一些生命周期比較長(zhǎng)的對(duì)象。為了對(duì)他們采用不同的收集策略芬骄,采用了分代收集算法偶芍,所以HotSpot虛擬機(jī)把的根據(jù)對(duì)象的年齡不同,把堆分位新生代德玫、老年代和永久代匪蟀。

在Java 8中 ,HotSpot虛擬機(jī)移除了永久代宰僧,使用本地內(nèi)存來存儲(chǔ)類元數(shù)據(jù)信息并稱之為:元空間(Metaspace)

運(yùn)行時(shí)數(shù)據(jù)區(qū)中哪些區(qū)域是線程共享的材彪?哪些是獨(dú)享的?

在JVM運(yùn)行時(shí)內(nèi)存區(qū)域中琴儿,PC寄存器段化、虛擬機(jī)棧和本地方法棧是線程獨(dú)享的。

而Java堆造成、方法區(qū)是線程共享的显熏。但是值得注意的是,Java堆其實(shí)還未每一個(gè)線程單獨(dú)分配了一塊TLAB空間晒屎,這部分空間在分配時(shí)是線程獨(dú)享的喘蟆,在使用時(shí)是線程共享的。

除了JVM運(yùn)行時(shí)內(nèi)存以外鼓鲁,還有什么區(qū)域可以用嗎蕴轨?

除了我們前面介紹的虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)以外,還有一部分內(nèi)存也被頻繁使用骇吭,他不是運(yùn)行時(shí)數(shù)據(jù)區(qū)的一部分橙弱,也不是Java虛擬機(jī)規(guī)范中定義的內(nèi)存區(qū)域,他就是——直接內(nèi)存。

直接內(nèi)存的分配不受Java堆大小的限制棘脐,但是他還是會(huì)收到服務(wù)器總內(nèi)存的影響斜筐。

在JDK 1.4中引入的NIO中,引入了一種基于Channel和Buffer的I/O方式蛀缝,他可以使用Native函數(shù)直接分配堆外內(nèi)存奴艾,然后通過一個(gè)存儲(chǔ)在Java堆中的DirectByteBuffer對(duì)象作為這塊內(nèi)存的應(yīng)用進(jìn)行操作。

堆和棧的區(qū)別是什么内斯?

堆和棧(虛擬機(jī)棧)是完全不同的兩塊內(nèi)存區(qū)域,一個(gè)是線程獨(dú)享的像啼,一個(gè)是線程共享的俘闯,二者之間最大的區(qū)別就是存儲(chǔ)的內(nèi)容不同:

堆中主要存放對(duì)象實(shí)例。
棧(局部變量表)中主要存放各種基本數(shù)據(jù)類型忽冻、對(duì)象的引用真朗。

Java中的數(shù)組是存儲(chǔ)在堆上還是棧上的?

在Java中僧诚,數(shù)組同樣是一個(gè)對(duì)象遮婶,所以對(duì)象在內(nèi)存中如何存放同樣適用于數(shù)組;

所以湖笨,數(shù)組的實(shí)例是保存在堆中旗扑,而數(shù)組的引用是保存在棧上的。

Java中的對(duì)象創(chuàng)建有多少種方式慈省?

Java中有很多方式可以創(chuàng)建一個(gè)對(duì)象臀防,最簡(jiǎn)單的方式就是使用new關(guān)鍵字。

User user = new User();
復(fù)制代碼

除此以外边败,還可以使用反射機(jī)制創(chuàng)建對(duì)象:

User user = User.class.newInstance();
復(fù)制代碼

或者使用Constructor類的newInstance:

Constructor<User> constructor = User.class.getConstructor();
User user = constructor.newInstance();
復(fù)制代碼

除此之外還可以使用clone方法和反序列化的方式袱衷,這兩種方式不常用并且代碼比較復(fù)雜,就不在這里展示了笑窜,感興趣的可以自行了解下致燥。

Java中對(duì)象創(chuàng)建的過程是怎么樣的?

對(duì)于一個(gè)普通的Java對(duì)象的創(chuàng)建排截,大致過程如下:

1嫌蚤、虛擬機(jī)遇到new指令,到常量池定位到這個(gè)類的符號(hào)引用断傲。
2搬葬、檢查符號(hào)引用代表的類是否被加載、解析艳悔、初始化過急凰。
3、虛擬機(jī)為對(duì)象分配內(nèi)存。
4抡锈、虛擬機(jī)將分配到的內(nèi)存空間都初始化為零值逾滥。
5、虛擬機(jī)對(duì)對(duì)象進(jìn)行必要的設(shè)置考赛。
6月趟、執(zhí)行方法,成員變量進(jìn)行初始化撇簿。

Java中的對(duì)象一定在堆上分配內(nèi)存嗎聂渊?

前面我們說過,Java堆中主要保存了對(duì)象實(shí)例四瘫,但是汉嗽,隨著JIT編譯期的發(fā)展與逃逸分析技術(shù)逐漸成熟,棧上分配找蜜、標(biāo)量替換優(yōu)化技術(shù)將會(huì)導(dǎo)致一些微妙的變化饼暑,所有的對(duì)象都分配到堆上也漸漸變得不那么“絕對(duì)”了。

其實(shí)洗做,在編譯期間弓叛,JIT會(huì)對(duì)代碼做很多優(yōu)化。其中有一部分優(yōu)化的目的就是減少內(nèi)存堆分配壓力诚纸,其中一種重要的技術(shù)叫做逃逸分析撰筷。

如果JIT經(jīng)過逃逸分析,發(fā)現(xiàn)有些對(duì)象沒有逃逸出方法畦徘,那么有可能堆內(nèi)存分配會(huì)被優(yōu)化成棧內(nèi)存分配闭专。

10、如何獲取堆和棧的dump文件旧烧?

Java Dump影钉,Java虛擬機(jī)的運(yùn)行時(shí)快照。將Java虛擬機(jī)運(yùn)行時(shí)的狀態(tài)和信息保存到文件掘剪。

可以使用在服務(wù)器上使用jmap命令來獲取堆dump平委,使用jstack命令來獲取線程的調(diào)用棧dump。


對(duì) JAVA 開發(fā)有興趣的朋友歡迎加入QQ群:710373545 里面資深架構(gòu)師會(huì)分享一些整理好的錄制視頻錄像和BATJ面試題:有Spring夺谁,MyBatis廉赔,Netty源碼分析,高并發(fā)匾鸥、高性能蜡塌、分布式、微服務(wù)架構(gòu)的原理勿负,JVM性能優(yōu)化馏艾、分布式架構(gòu)等這些成為架構(gòu)師必備的知識(shí)體系。還能領(lǐng)取免費(fèi)的學(xué)習(xí)資源,目前受益良多琅摩。

共同探討铁孵!


原文鏈接:https://juejin.im/post/5d4789afe51d453b386a62ac

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市房资,隨后出現(xiàn)的幾起案子蜕劝,更是在濱河造成了極大的恐慌,老刑警劉巖轰异,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岖沛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡搭独,警方通過查閱死者的電腦和手機(jī)婴削,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戳稽,“玉大人,你說我怎么就攤上這事期升【妫” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵播赁,是天一觀的道長(zhǎng)颂郎。 經(jīng)常有香客問我,道長(zhǎng)容为,這世上最難降的妖魔是什么乓序? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮坎背,結(jié)果婚禮上替劈,老公的妹妹穿的比我還像新娘。我一直安慰自己得滤,他們只是感情好陨献,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著懂更,像睡著了一般眨业。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沮协,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天龄捡,我揣著相機(jī)與錄音,去河邊找鬼慷暂。 笑死聘殖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播就斤,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼悍募,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了洋机?” 一聲冷哼從身側(cè)響起坠宴,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绷旗,沒想到半個(gè)月后喜鼓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衔肢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年庄岖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片角骤。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡隅忿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出邦尊,到底是詐尸還是另有隱情背桐,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布蝉揍,位于F島的核電站链峭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏又沾。R本人自食惡果不足惜弊仪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望杖刷。 院中可真熱鬧励饵,春花似錦、人聲如沸滑燃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽不瓶。三九已至禾嫉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚊丐,已是汗流浹背熙参。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留麦备,地道東北人孽椰。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓昭娩,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親黍匾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子栏渺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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