Java必考題目之JVM面試題目和答案

JVM內(nèi)存模型

首先我們來(lái)了解一下JVM的內(nèi)存模型的怎么樣的:


1.堆:存放對(duì)象實(shí)例侥涵,幾乎所有的對(duì)象實(shí)例都在這里分配內(nèi)存

?堆得內(nèi)存由-Xms指定狡汉,默認(rèn)是物理內(nèi)存的1/64刚夺;最大的內(nèi)存由-Xmx指定果录,默認(rèn)是物理內(nèi)存的1/4咽袜。

?默認(rèn)空余的堆內(nèi)存小于40%時(shí)讹开,就會(huì)增大盅视,直到-Xmx設(shè)置的內(nèi)存。具體的比例可以由-XX:MinHeapFreeRatio指定

?空余的內(nèi)存大于70%時(shí)旦万,就會(huì)減少內(nèi)存闹击,直到-Xms設(shè)置的大小。具體由-XX:MaxHeapFreeRatio指定成艘。

2.虛擬機(jī)棧

虛擬機(jī)棧描述的是Java方法執(zhí)行的內(nèi)存模型:每個(gè)方法被執(zhí)行的時(shí)候都會(huì)同時(shí)創(chuàng)建一個(gè)棧幀(Stack Frame)用于存儲(chǔ)局部變量表赏半、操作棧、動(dòng)態(tài)鏈接淆两、方法出口等信息本地方法棧:本地方法棧則是為虛擬機(jī)使用到的Native方法服務(wù)断箫。

3.方法區(qū):存儲(chǔ)已被虛擬機(jī)加載的類元數(shù)據(jù)信息(元空間)

1)有時(shí)候也成為永久代,在該區(qū)內(nèi)很少發(fā)生垃圾回收琼腔,但是并不代表不發(fā)生GC瑰枫,在這里進(jìn)行的GC主要是對(duì)方法區(qū)里的常量池和對(duì)類型的卸載

2)方法區(qū)主要用來(lái)存儲(chǔ)已被虛擬機(jī)加載的類的信息、常量丹莲、靜態(tài)變量和即時(shí)編譯器編譯后的代碼等數(shù)據(jù)光坝。

該區(qū)域是被線程共享的。

3)方法區(qū)里有一個(gè)運(yùn)行時(shí)常量池甥材,用于存放靜態(tài)編譯產(chǎn)生的字面量和符號(hào)引用盯另。該常量池具有動(dòng)態(tài)性,也就是說(shuō)常量并不一定是編譯時(shí)確定洲赵,運(yùn)行時(shí)生成的常量也會(huì)存在這個(gè)常量池中鸳惯。

4.程序計(jì)數(shù)器:當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器

總結(jié):


JVM垃圾回收算法

1.標(biāo)記-清除:?這是垃圾收集算法中最基礎(chǔ)的商蕴,根據(jù)名字就可以知道,它的思想就是標(biāo)記哪些要被回收的對(duì)象芝发,然后統(tǒng)一回收绪商。這種方法很簡(jiǎn)單,但是會(huì)有兩個(gè)主要問(wèn)題:1.效率不高辅鲸,標(biāo)記和清除的效率都很低格郁;2.會(huì)產(chǎn)生大量不連續(xù)的內(nèi)存碎片,導(dǎo)致以后程序在分配較大的對(duì)象時(shí)独悴,由于沒(méi)有充足的連續(xù)內(nèi)存而提前觸發(fā)一次GC動(dòng)作例书。

2.復(fù)制算法: 為了解決效率問(wèn)題,復(fù)制算法將可用內(nèi)存按容量劃分為相等的兩部分刻炒,然后每次只使用其中的一塊决采,當(dāng)一塊內(nèi)存用完時(shí),就將還存活的對(duì)象復(fù)制到第二塊內(nèi)存上坟奥,然后一次性清楚完第一塊內(nèi)存树瞭,再將第二塊上的對(duì)象復(fù)制到第一塊。但是這種方式筏勒,內(nèi)存的代價(jià)太高移迫,每次基本上都要浪費(fèi)一般的內(nèi)存。 于是將該算法進(jìn)行了改進(jìn)管行,內(nèi)存區(qū)域不再是按照1:1去劃分厨埋,而是將內(nèi)存劃分為8:1:1三部分,較大那份內(nèi)存交Eden區(qū)捐顷,其余是兩塊較小的內(nèi)存區(qū)叫Survior區(qū)荡陷。每次都會(huì)優(yōu)先使用Eden區(qū),若Eden區(qū)滿迅涮,就將對(duì)象復(fù)制到第二塊內(nèi)存區(qū)上废赞,然后清除Eden區(qū),如果此時(shí)存活的對(duì)象太多叮姑,以至于Survivor不夠時(shí)唉地,會(huì)將這些對(duì)象通過(guò)分配擔(dān)保機(jī)制復(fù)制到老年代中。(java堆又分為新生代和老年代)

3. 標(biāo)記-整理?該算法主要是為了解決標(biāo)記-清除传透,產(chǎn)生大量?jī)?nèi)存碎片的問(wèn)題耘沼;當(dāng)對(duì)象存活率較高時(shí),也解決了復(fù)制算法的效率問(wèn)題朱盐。它的不同之處就是在清除對(duì)象的時(shí)候現(xiàn)將可回收對(duì)象移動(dòng)到一端群嗤,然后清除掉端邊界以外的對(duì)象,這樣就不會(huì)產(chǎn)生內(nèi)存碎片了兵琳。

4.分代收集?現(xiàn)在的虛擬機(jī)垃圾收集大多采用這種方式狂秘,它根據(jù)對(duì)象的生存周期骇径,將堆分為新生代和老年代。在新生代中者春,由于對(duì)象生存期短破衔,每次回收都會(huì)有大量對(duì)象死去,那么這時(shí)就采用復(fù)制算法钱烟。老年代里的對(duì)象存活率較高运敢,沒(méi)有額外的空間進(jìn)行分配擔(dān)保,所以可以使用標(biāo)記-整理 或者 標(biāo)記-清除忠售。

JVM垃圾收集器有哪些?以及優(yōu)劣勢(shì)比較迄沫?

1.串行收集器??

串行收集器是最簡(jiǎn)單的稻扬,它設(shè)計(jì)為在單核的環(huán)境下工作(32位或者windows),你幾乎不會(huì)使用到它羊瘩。它在工作的時(shí)候會(huì)暫停整個(gè)應(yīng)用的運(yùn)行泰佳,因此在所有服務(wù)器環(huán)境下都不可能被使用。

使用方法:-XX:+UseSerialGC

2.并行收集器

這是JVM默認(rèn)的收集器尘吗,跟它名字顯示的一樣逝她,它最大的優(yōu)點(diǎn)是使用多個(gè)線程來(lái)掃描和壓縮堆。缺點(diǎn)是在minor和full GC的時(shí)候都會(huì)暫停應(yīng)用的運(yùn)行睬捶。并行收集器最適合用在可以容忍程序停滯的環(huán)境使用黔宛,它占用較低的CPU因而能提高應(yīng)用的吞吐(throughput)。

使用方法:-XX:+UseParallelGC

3.CMS收集器

CMS是Concurrent-Mark-Sweep的縮寫擒贸,并發(fā)的標(biāo)記與清除臀晃。

這個(gè)算法使用多個(gè)線程并發(fā)地(concurrent)掃描堆,標(biāo)記不使用的對(duì)象介劫,然后清除它們回收內(nèi)存徽惋。在兩種情況下會(huì)使應(yīng)用暫停(Stop the World, STW):

1. 當(dāng)初次開始標(biāo)記根對(duì)象時(shí)initial mark。

2. 當(dāng)在并行收集時(shí)應(yīng)用又改變了堆的狀態(tài)時(shí)座韵,需要它從頭再確認(rèn)一次標(biāo)記了正確的對(duì)象final remark险绘。

這個(gè)收集器最大的問(wèn)題是在年輕代與老年代收集時(shí)會(huì)出現(xiàn)的一種競(jìng)爭(zhēng)情況(race condition),稱為提升失敗promotion failure誉碴。對(duì)象從年輕代復(fù)制到老年代稱為提升promotion宦棺,但有時(shí)侯老年代需要清理出足夠空間來(lái)放這些對(duì)象,這需要一定的時(shí)間翔烁,它收集的速度可能趕不上不斷產(chǎn)生的要提升的年輕代對(duì)象的速度渺氧,這時(shí)就需要做STW的收集。STW正是CMS想避免的問(wèn)題蹬屹。為了避免這個(gè)問(wèn)題侣背,需要增加老年代的空間大小或者增加更多的線程來(lái)做老年代的收集以趕上從年輕代復(fù)制對(duì)象的速度白华。

除了上文所說(shuō)的內(nèi)容之外,CMS最大的問(wèn)題就是內(nèi)存空間碎片化的問(wèn)題贩耐。CMS只有在觸發(fā)FullGC的情況下才會(huì)對(duì)堆空間進(jìn)行compact弧腥。如果線上應(yīng)用長(zhǎng)時(shí)間運(yùn)行,碎片化會(huì)非常嚴(yán)重潮太,會(huì)很容易造成promotion failed管搪。為了解決這個(gè)問(wèn)題線上很多應(yīng)用通過(guò)定期重啟或者手工觸發(fā)FullGC來(lái)觸發(fā)碎片整理。

對(duì)比并行收集器它的一個(gè)壞處是需要占用比較多的CPU铡买。對(duì)于大多數(shù)長(zhǎng)期運(yùn)行的服務(wù)器應(yīng)用來(lái)說(shuō)更鲁,這通常是值得的,因?yàn)樗粫?huì)導(dǎo)致應(yīng)用長(zhǎng)時(shí)間的停滯奇钞。但是它不是JVM的默認(rèn)的收集器澡为。

4.G1收集器

如果你的堆內(nèi)存大于4G的話,那么G1會(huì)是要考慮使用的收集器景埃。它是為了更好支持大于4G堆內(nèi)存在JDK 7 u4引入的媒至。G1收集器把堆分成多個(gè)區(qū)域,大小從1MB到32MB谷徙,并使用多個(gè)后臺(tái)線程來(lái)掃描這些區(qū)域拒啰,優(yōu)先會(huì)掃描最多垃圾的區(qū)域,這就是它名稱的由來(lái)完慧,垃圾優(yōu)先Garbage First谋旦。

如果在后臺(tái)線程完成掃描之前堆空間耗光的話,才會(huì)進(jìn)行STW收集骗随。它另外一個(gè)優(yōu)點(diǎn)是它在處理的同時(shí)會(huì)整理壓縮堆空間蛤织,相比CMS只會(huì)在完全STW收集的時(shí)候才會(huì)這么做。

使用過(guò)大的堆內(nèi)存在過(guò)去幾年是存在爭(zhēng)議的鸿染,很多開發(fā)者從單個(gè)JVM分解成使用多個(gè)JVM的微服務(wù)(micro-service)和基于組件的架構(gòu)指蚜。其他一些因素像分離程序組件、簡(jiǎn)化部署和避免重新加載類到內(nèi)存的考慮也促進(jìn)了這樣的分離涨椒。

除了這些因素摊鸡,最大的因素當(dāng)然是避免在STW收集時(shí)JVM用戶線程停滯時(shí)間過(guò)長(zhǎng),如果你使用了很大的堆內(nèi)存的話就可能出現(xiàn)這種情況蚕冬。另外免猾,像Docker那樣的容器技術(shù)讓你可以在一臺(tái)物理機(jī)器上輕松部署多個(gè)應(yīng)用也加速了這種趨勢(shì)。

使用方法:-XX:+UseG1GC

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末囤热,一起剝皮案震驚了整個(gè)濱河市猎提,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旁蔼,老刑警劉巖锨苏,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疙教,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡伞租,警方通過(guò)查閱死者的電腦和手機(jī)贞谓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)葵诈,“玉大人裸弦,你說(shuō)我怎么就攤上這事∽鞔” “怎么了理疙?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)泞坦。 經(jīng)常有香客問(wèn)我沪斟,道長(zhǎng),這世上最難降的妖魔是什么暇矫? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮择吊,結(jié)果婚禮上李根,老公的妹妹穿的比我還像新娘。我一直安慰自己几睛,他們只是感情好房轿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著所森,像睡著了一般囱持。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上焕济,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天纷妆,我揣著相機(jī)與錄音,去河邊找鬼晴弃。 笑死掩幢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的上鞠。 我是一名探鬼主播际邻,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼芍阎!你這毒婦竟也來(lái)了世曾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谴咸,失蹤者是張志新(化名)和其女友劉穎轮听,沒(méi)想到半個(gè)月后骗露,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蕊程,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年椒袍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片藻茂。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡驹暑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辨赐,到底是詐尸還是另有隱情优俘,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布掀序,位于F島的核電站帆焕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏不恭。R本人自食惡果不足惜叶雹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望换吧。 院中可真熱鬧折晦,春花似錦、人聲如沸沾瓦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)贯莺。三九已至风喇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缕探,已是汗流浹背魂莫。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爹耗,地道東北人豁鲤。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像鲸沮,于是被迫代替她去往敵國(guó)和親琳骡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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