《趣學(xué)編程》深入理解Java虛擬機(jī)

哈嘍!大家好,我是小奇蔬啡,一位不靠譜的程序員

小奇打算以輕松幽默的對(duì)話方式來(lái)分享一些技術(shù),如果你覺(jué)得通過(guò)小奇的文章學(xué)到了東西镀虐,那就給小奇一個(gè)贊吧

文章持續(xù)更新箱蟆,可以微信搜索【小奇JAVA面試】第一時(shí)間閱讀,回復(fù)【資料】更有我為大家準(zhǔn)備的福利喲刮便!

文章目錄

前言

面試

Java虛擬機(jī)內(nèi)存模型

垃圾收集器與內(nèi)存分配策略

虛擬機(jī)性能監(jiān)控空猜、故障處理工具

總結(jié)

前言

作為一名Java程序員,Java虛擬機(jī)是我們不必學(xué)會(huì)就可以搬磚工作的一種技能點(diǎn)恨旱,但是小奇為什么還要講一下呢辈毯?難道就是為了浪費(fèi)大家1分鐘的寶貴時(shí)間,一個(gè)人1分鐘搜贤,50萬(wàn)人就是1年谆沃,5000萬(wàn)人就是100年,賺了入客,小奇以一己之力成功搞掛一個(gè)人(血賺)管毙。

當(dāng)然不是,并且小奇的文章也沒(méi)有那么多人看桌硫,最多也就浪費(fèi)個(gè)吧夭咬。

學(xué)習(xí)Java虛擬機(jī)是因?yàn)?b>面試官要問(wèn)啊!铆隘,所以我們就要學(xué)卓舵,什么?不實(shí)用的你不學(xué)膀钠?那鄰居小奇可要使勁學(xué)啦掏湾,到時(shí)候面試官只要小奇不要你裹虫。

至于你問(wèn)為什么面試官要問(wèn)Java虛擬機(jī)呢,這個(gè)融击。筑公。。我把這次機(jī)會(huì)留給你尊浪,下次你面試的時(shí)候面試官問(wèn):“講一下Java虛擬機(jī)的內(nèi)存模型”匣屡。你:“面試官你好,請(qǐng)問(wèn)為什么你要問(wèn)Java虛擬機(jī)呢拇涤,你給我臺(tái)電腦捣作,我五分鐘給你搭建好圖書管理系統(tǒng)他不香嗎,咱們鍵盤上見(jiàn)真章”鹅士。這時(shí)面試官就會(huì)告訴你答案券躁,你就可以把答案打在評(píng)論區(qū),讓小奇以及眾多小伙伴一起知道一下到底為什么要問(wèn)掉盅?

面試

在一個(gè)晴朗的周日也拜,我來(lái)到了一個(gè)陌生的園區(qū)(別問(wèn)為什么是周日,問(wèn)就是997怔接,不過(guò)為了填飽肚子的打工人搪泳,只能明知山有虎稀轨、偏向虎山行)扼脐,坐在陌生的會(huì)議室,等待HR小姐姐去叫面試官奋刽,此時(shí)我的心情和各位小伙伴一樣五味雜陳瓦侮,擔(dān)心面試官問(wèn)的會(huì)不會(huì)很難?問(wèn)到我的知識(shí)盲區(qū)我該怎么辦佣谐?

一會(huì)自我介紹的時(shí)候要不要吹一下我和小奇的關(guān)系肚吏?

一位英俊瀟灑,眼神犀利的面試官走了進(jìn)來(lái)狭魂,看到他那犀利罚攀、仿佛能看穿一切的眼神 ,我在想要不然一會(huì)就不要20k了雌澄,要8k得了斋泄,這個(gè)面試官一看就不好糊弄啊,但是我想起來(lái)我來(lái)之前剛看了小奇的趣學(xué)編程系列镐牺,我已經(jīng)完全學(xué)會(huì)了小奇的精髓炫掐,我頓時(shí)就來(lái)了底氣,決定一會(huì)要30k睬涧,不給就學(xué)小奇賴著不走(哈哈)

面試官:小奇是吧募胃,帶簡(jiǎn)歷了嗎旗唁?

我:沒(méi)帶,現(xiàn)在彩印兩塊一張痹束,我簡(jiǎn)歷五張检疫,每次面試都要花費(fèi)十塊,我朋友說(shuō)了還沒(méi)工作就先讓你掏錢的工作不要去祷嘶。

面試官:电谣。。抹蚀。那你靠什么來(lái)征服我剿牺,讓我錄用你

我:氣質(zhì)?

(此時(shí)面試官并沒(méi)有叫保安环壤,而是從門后拿出了恭候我多時(shí)的棍子晒来,我瞬間慫了)

(我只好從我的雙肩包中拿出了我從上午沒(méi)有面試通過(guò)的其他公司面試官手中要回的簡(jiǎn)歷,上午的情形是這樣的郑现,上午的面試官:今天的面試就到這吧湃崩,回去等通知吧!我:面試官你好接箫,如果貴公司不打算錄取我的話攒读,能不能把我的紙質(zhì)簡(jiǎn)歷還給我,我下午還有一家面試辛友。上午的面試官:我說(shuō)你的簡(jiǎn)歷怎么皺皺巴巴薄扁,原來(lái)你一直在循環(huán)利用啊废累!這個(gè)癥狀出現(xiàn)多久了邓梅?我:半拉月了。邑滨。日缨。)

(當(dāng)我把皺皺巴巴的簡(jiǎn)歷交給面試官后,這場(chǎng)面試才得以繼續(xù)進(jìn)行掖看。匣距。。)

Java虛擬機(jī)內(nèi)存模型

面試官:我看你簡(jiǎn)歷上寫的精通Java虛擬機(jī)哎壳?(哼毅待,面試官輕蔑的一笑)

(此時(shí)我的內(nèi)心非常緊張,緊張的并不是面試官把我問(wèn)住耳峦,而是我如果虛擬機(jī)這方面回答的太專業(yè)了面試官聽(tīng)不懂怎么辦猬错,他如果不信我回答的怎么辦轰驳,此時(shí)我偷偷看了一下我藏在桌下的《深入理解Java虛擬機(jī)》惠桃,如果他不信我就拿出書來(lái)和他對(duì)峙)

我:也不算精通吧,都是同行們抬愛(ài)邑飒。

面試官:那你說(shuō)一下JVM虛擬機(jī)的內(nèi)存模型吧

我:JVM虛擬機(jī)中有一個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū),里面主要分為程序計(jì)數(shù)器级乐、虛擬機(jī)棧疙咸、本地方法棧、堆风科、方法區(qū)

面試官:嗯撒轮。假如我們new一個(gè)對(duì)象這個(gè)時(shí)候是放在哪里?

我:堆里

面試官:嗯贼穆。假如我們int定義一個(gè)變量number放在哪里题山?

我:棧里

面試官:嗯。小伙子真是惜字如金啊故痊,能不能詳細(xì)介紹一下這幾個(gè)區(qū)域都是干什么的嗎

我:那我就獻(xiàn)丑了顶瞳。。愕秫。

1.程序計(jì)數(shù)器:簡(jiǎn)單來(lái)說(shuō)每一個(gè)線程在執(zhí)行代碼的時(shí)候執(zhí)行到哪一行是有一個(gè)記錄的慨菱,比如線程A執(zhí)行到代碼第10行了這個(gè)時(shí)候在線程A中是有一個(gè)程序計(jì)數(shù)器來(lái)記錄10這一行。程序計(jì)數(shù)器在線程中是私有的戴甩。那么他有什么好處呢符喝?雖然我們開(kāi)發(fā)的時(shí)候可以使用多線程來(lái)開(kāi)發(fā),但是CPU在執(zhí)行A線程的時(shí)候B線程就需要等待甜孤,等到CPU去執(zhí)行A線程的時(shí)候B線程又需要等待了协饲,所以說(shuō)如果這個(gè)時(shí)候CPU去執(zhí)行B線程,那么執(zhí)行完后再回來(lái)執(zhí)行A線程的時(shí)候就知道之前執(zhí)行到哪一行了课蔬,可以從這一行接著執(zhí)行囱稽。

2.虛擬機(jī)棧:與程序計(jì)數(shù)器一樣郊尝,虛擬機(jī)棧也是線程私有的二跋,虛擬機(jī)是棧是存放執(zhí)行方法的時(shí)候用到的一些信息,例如在執(zhí)行方法的時(shí)候虛擬機(jī)就會(huì)創(chuàng)建一個(gè)棧幀用于存儲(chǔ)局部變量表(表里是局部變量)流昏、操作數(shù)棧(如果要進(jìn)行一些數(shù)的計(jì)算扎即,那么會(huì)把數(shù)先讀取到操作數(shù)棧中進(jìn)行操作最后賦值到局部變量表中)、動(dòng)態(tài)鏈接况凉、方法出口等信息谚鄙。

3.堆:堆是線程共享的,堆是虛擬機(jī)所管理的內(nèi)存中最大的一塊刁绒,一般優(yōu)化就是優(yōu)化這塊內(nèi)存闷营,比如我們Student st = new Student();那么我們新創(chuàng)建出來(lái)的對(duì)象就在堆內(nèi)存里。

4.本地方法棧:本地方法棧是用來(lái)執(zhí)行本地方法的時(shí)候所使用的,例如Java中我們會(huì)看到很多Native方法傻盟,這些方法使用例如c語(yǔ)言寫的速蕊,Java中只是調(diào)用。

5.方法區(qū):方法區(qū)是線程共享的娘赴,它用于存儲(chǔ)已被虛擬機(jī)加載的類型信息规哲、常量、靜態(tài)變量等诽表。在方法區(qū)中還包含一個(gè)運(yùn)行時(shí)常量池部分唉锌,這一部分用于存放編譯期生成的各種字面量與符號(hào)引用,這部分內(nèi)容將在類加載后存放到方法區(qū)的運(yùn)行時(shí)常量池中竿奏,所謂符號(hào)引用其實(shí)就是將一個(gè)例如main方法這個(gè)方法引用轉(zhuǎn)化為指針應(yīng)用袄简,可以更加快速的找到這個(gè)方法在磁盤中的真正位置

面試官:嗯》盒ィ可以痘番,回答的很全面,平時(shí)都怎么學(xué)習(xí)提高呢平痰?

我:看小奇的文章(此時(shí)真想給小奇的文章一個(gè)贊)

面試官:說(shuō)一下對(duì)象創(chuàng)建的流程吧

我:(還想歇會(huì)喝口水呢汞舱,這么快就問(wèn)下一個(gè)知識(shí)點(diǎn)了,我偷偷翻書看一下宗雇。昂芜。。)

當(dāng)虛擬機(jī)接收到new Student()的命令后赔蒲,他會(huì)先去常量池中查看這個(gè)Student()類是否有相應(yīng)的符號(hào)引用泌神,并且這個(gè)類是否被加載、解析舞虱、初始化過(guò)欢际,如果沒(méi)有的話需要先進(jìn)行類的加載、解析矾兜、初始化损趋。

面試官:嗯。那我創(chuàng)建對(duì)象的時(shí)候怎么給它分配內(nèi)存呢椅寺,有哪些方法浑槽?

我:可以使用指針碰撞、空閑列表等方式返帕。

指針碰撞:假如堆空間現(xiàn)在沒(méi)有數(shù)據(jù)桐玻,并且堆空間是一個(gè)方形的空間,那么我們用一個(gè)指針?lè)旁谄鹗嘉恢镁S簿褪蔷o挨著邊镊靴,這個(gè)時(shí)候有一個(gè)占用1M的對(duì)象要?jiǎng)?chuàng)建了,那么我們的指針就從初始位置開(kāi)始從左向右走1M的距離,這個(gè)時(shí)候又有一個(gè)10M的對(duì)象要?jiǎng)?chuàng)建了偏竟,我們的指針從當(dāng)前位置又向右走了10M的距離算行,這個(gè)時(shí)候有一個(gè)1G的對(duì)象來(lái)了(指針:我淦。苫耸。州邢。),指針向右走到頭了也沒(méi)有1G的距離褪子,這個(gè)時(shí)候就創(chuàng)建不了這個(gè)1G的對(duì)象了量淌。

空閑列表:指針碰撞的方式適用于堆空間連續(xù)的這種方式,如果不連續(xù)的話就不能從左到右來(lái)分配空間了嫌褪,這個(gè)時(shí)候就需要用到空閑列表了呀枢,使用一個(gè)空閑列表來(lái)記錄哪些空間是空閑的,新創(chuàng)建一個(gè)對(duì)象就放到那里去笼痛。

面試官:嗯裙秋。那我們剛剛創(chuàng)建了一個(gè)對(duì)象, 你能說(shuō)一下對(duì)象里又是怎樣的一個(gè)內(nèi)存布局嗎缨伊?

我:(真是往祖墳里挖啊摘刑。。刻坊。偷偷看看書枷恕,淦)

對(duì)象里可以劃分為三個(gè)部分:對(duì)象頭、實(shí)例數(shù)據(jù)谭胚、對(duì)齊填充徐块。

面試官:額。灾而。胡控。可以詳細(xì)展開(kāi)了說(shuō)一下嗎旁趟,你這樣別人也能答出來(lái)

我:(就看了一眼書昼激,記不住那么多啊,算了硬著頭皮來(lái)吧)

對(duì)象頭:對(duì)象頭中存儲(chǔ)了對(duì)象自身運(yùn)行時(shí)的數(shù)據(jù)轻庆,如哈希碼癣猾、GC分代年齡、鎖狀態(tài)標(biāo)志余爆、線程持有的鎖、偏向線程ID夸盟、偏向時(shí)間戳以及指向它的類型元數(shù)據(jù)的指針(通過(guò)這個(gè)指針來(lái)確定對(duì)象是哪個(gè)類的實(shí)例)蛾方。

實(shí)例數(shù)據(jù):這一部分是我們真正在對(duì)象中定義的信息,比如對(duì)象中的一些字段等內(nèi)容,還有繼承父類的一些內(nèi)容和在子類中定義的字段都在此記錄桩砰。

對(duì)齊填充:這一部分并不是每個(gè)對(duì)象都存在的拓春,因?yàn)樘摂M機(jī)要求對(duì)象的起始地址必須是8字節(jié)的整數(shù)倍,假如我們實(shí)例數(shù)據(jù)只有4字節(jié)亚隅,那么我們需要另外填充4字節(jié)的數(shù)據(jù)來(lái)保證對(duì)象的起始位置是8字節(jié)的整數(shù)倍硼莽。.

垃圾收集器與內(nèi)存分配策略

面試官:嗯。說(shuō)一下虛擬機(jī)怎么判斷一個(gè)對(duì)象是否是垃圾對(duì)象

我:(這么快又換下一個(gè)知識(shí)點(diǎn)了煮纵,啥時(shí)候能喝口水呢懂鸵。。行疏。)

可以采用可達(dá)性分析算法和引用計(jì)數(shù)算法來(lái)判斷對(duì)象是否是垃圾對(duì)象匆光。

面試官:嗯。繼續(xù)說(shuō)下去

我:

可達(dá)性分析算法:會(huì)從一個(gè)“GC Root”根開(kāi)始依據(jù)引用關(guān)系向下搜索酿联,如果不能搜索到的證明是垃圾對(duì)象终息。

引用計(jì)數(shù)算法:當(dāng)一個(gè)對(duì)象被引用的時(shí)候就會(huì)在這個(gè)對(duì)象中的引用計(jì)數(shù)器中加1,如果引用失效時(shí)贞让,計(jì)數(shù)器的值就會(huì)減1周崭,當(dāng)這個(gè)對(duì)象的引用計(jì)數(shù)器為0的時(shí)候就證明這個(gè)對(duì)象是垃圾對(duì)象,不過(guò)這種算法有一個(gè)缺點(diǎn)喳张,就是兩個(gè)對(duì)象之間相互引用的時(shí)候就會(huì)認(rèn)為兩個(gè)對(duì)象都不是垃圾對(duì)象休傍,但是這兩個(gè)對(duì)象是因?yàn)檠h(huán)依賴造成的問(wèn)題,理應(yīng)被清理掉蹲姐,但是這種算法解決不了這種循環(huán)引用的問(wèn)題磨取。

面試官:嗯。有哪些垃圾收集算法呢柴墩?

我:(二分法忙厌、三分法、四江咳。逢净。。不對(duì)歼指,怎么感覺(jué)背串了爹土,還是不編了,偷偷看一下書吧)

標(biāo)記-清除算法踩身、標(biāo)記-復(fù)制算法胀茵、標(biāo)記-整理算法

面試官:嗯⌒瑁可以再詳細(xì)的說(shuō)一下算法的具體內(nèi)容嗎琼娘?

我:

標(biāo)記-清除算法:此算法主要用于一塊內(nèi)存區(qū)的垃圾收集器峭弟,在標(biāo)記后直接做清除操作,不會(huì)再做后續(xù)的操作脱拼。

標(biāo)記-復(fù)制算法:此算法主要用于兩塊內(nèi)存區(qū)的垃圾收集器瞒瘸,將存活對(duì)象標(biāo)記,然后將存活對(duì)象放入保留區(qū)域中熄浓,然后將之前的一塊區(qū)域全部清理掉作為下一次的保留區(qū)域情臭。

標(biāo)記-整理算法:此算法主要用于一塊內(nèi)存區(qū)的垃圾收集器,他與標(biāo)記清除算法的區(qū)別在于他清除后會(huì)將內(nèi)存區(qū)域中存活的對(duì)象重新整理到一起赌蔑,使得剩下的空間可以連續(xù)起來(lái)俯在。

面試官:嗯」喏ǎ可以說(shuō)一下都有哪些垃圾收集器嗎朝巫?

我:(三V肉、爬牛石景、爬V肉死砍胃汁劈猿、三V肉偶得、爬V肉偶得潮孽、CMS揪荣、G1、ZGC往史,我想了想還是畫出來(lái)吧仗颈,畢竟我的英語(yǔ)水平讀出來(lái)面試官可能會(huì)懷疑人生)

1、Serial收集器(三V肉)

Serial收集器是最基礎(chǔ)椎例、歷史最悠久的收集器挨决,這個(gè)收集器是一個(gè)單線程工作的收集器。

2订歪、ParNew收集器(爬牛)

ParNew收集器實(shí)質(zhì)上是Serial收集器的多線程并行版本脖祈,可以同時(shí)使用多條線程進(jìn)行垃圾收集。

3刷晋、Parallel Scavenge 收集器(爬V肉死砍胃汁)

Parallel Scavenge收集器是一款新生代收集器盖高,它是基于標(biāo)記-復(fù)制算法實(shí)現(xiàn)的收集器。Parallel Scavenge收集器的目標(biāo)則是達(dá)到一個(gè)可控制的吞吐量眼虱,所謂吞吐量就是處理器用于運(yùn)行用戶代碼的時(shí)間與處理器總消耗時(shí)間的比值喻奥,即。

4捏悬、Serial Old收集器(三V肉偶得)

Serial Old是Serial收集器的老年代版本撞蚕,它同樣是一個(gè)單線程收集器。

5邮破、Parallel Old收集器(爬V肉偶得)

Parallel Old收集器是Parallel Scavenge收集器的老年代版本诈豌,支持多線程并行收集仆救,基于標(biāo)記-整理算法實(shí)現(xiàn)抒和。

6矫渔、CMS收集器

CMS收集器是一種以獲取最短回收停頓時(shí)間為目標(biāo)的收集器,它的運(yùn)作過(guò)程分為四個(gè)步驟摧莽,包括:

1> 初始標(biāo)記

2> 并發(fā)標(biāo)記

3> 重新標(biāo)記

4> 并發(fā)清除

初始標(biāo)記:初始標(biāo)記需要stw庙洼,初始標(biāo)記僅僅只是標(biāo)記一下GC Roots能直接關(guān)聯(lián)到的對(duì)象,速度很快镊辕。

并發(fā)標(biāo)記:并發(fā)標(biāo)記階段就是從GC Roots的直接關(guān)聯(lián)對(duì)象開(kāi)始遍歷整個(gè)對(duì)象圖的過(guò)程油够,這個(gè)過(guò)程耗時(shí)較長(zhǎng)但是不需要停頓用戶線程,可以與垃圾收集線程一起并發(fā)運(yùn)行征懈。

重新標(biāo)記:重新標(biāo)記階段則是為了修正并發(fā)標(biāo)記期間石咬,因用戶程序繼續(xù)運(yùn)作而導(dǎo)致標(biāo)記產(chǎn)生變動(dòng)的那一部分對(duì)象的標(biāo)記記錄,這個(gè)階段的停頓時(shí)間通常會(huì)比初始標(biāo)記階段稍長(zhǎng)一些卖哎,但也遠(yuǎn)比并發(fā)標(biāo)記階段的時(shí)間短鬼悠。

并發(fā)清除:這個(gè)階段清理刪除掉標(biāo)記階段判斷的已經(jīng)死亡的對(duì)象,由于不需要移動(dòng)存活對(duì)象亏娜,所以這個(gè)階段也是可以與用戶線程同時(shí)并發(fā)的焕窝。

6、Garbage First 收集器(簡(jiǎn)稱G1收集器)

G1不再堅(jiān)持固定大小以及固定數(shù)量的分代區(qū)域劃分维贺,而是把連續(xù)的Java堆劃分為多個(gè)大小相等的獨(dú)立區(qū)域(Region)它掂,每一個(gè)Region都可以根據(jù)需要,扮演新生代的Eden空間溯泣、Survivor空間虐秋,或者老年代空間。如圖垃沦。

G1收集器的運(yùn)作過(guò)程大致可以劃分為以下四個(gè)步驟:

初始標(biāo)記:僅僅只是標(biāo)記一下GC Roots能直接關(guān)聯(lián)到的對(duì)象客给,

并發(fā)標(biāo)記:從GC Root開(kāi)始對(duì)堆中對(duì)象進(jìn)行可達(dá)性分析,遞歸掃描整個(gè)堆里的對(duì)象圖栏尚,找出要回收的對(duì)象起愈,這階段耗時(shí)較長(zhǎng),但可與用戶程序并發(fā)執(zhí)行译仗。

最終標(biāo)記:對(duì)用戶線程做另一個(gè)短暫的暫停抬虽,用于處理并發(fā)階段結(jié)束后仍遺留下來(lái)的最后那少量的SATB記錄。

篩選回收:負(fù)責(zé)更新Region的統(tǒng)計(jì)數(shù)據(jù)纵菌,對(duì)各個(gè)Region的回收價(jià)值和成本進(jìn)行排序阐污,根據(jù)用戶所期望的停頓時(shí)間來(lái)制定回收計(jì)劃,可以自由選擇任意多個(gè)Region構(gòu)成回收集咱圆,然后把決定回收的那一部分Region的存活對(duì)象復(fù)制到空的Region中笛辟,再清理掉整個(gè)舊Region的全部空間功氨。這里的操作設(shè)計(jì)存活對(duì)象的移動(dòng),是必須暫停用戶線程手幢,由多條收集器線程并行完成的捷凄。

面試官:嗯∥Ю矗可以說(shuō)一下JVM堆內(nèi)存模型嗎跺涤?

我:

堆內(nèi)存模型分為年輕代和老年代,其中年輕代中又分為Eden區(qū)和Survivor區(qū)监透,Survivor區(qū)又分為S0和S1區(qū)桶错。

面試官:嗯≌吐可以說(shuō)一下對(duì)象在堆中的流轉(zhuǎn)與回收策略嗎院刁?

我:(這可有點(diǎn)多了。粪狼。退腥。說(shuō)了不知道你能不能聽(tīng)得懂啊,算了鸳玩,不行就拿出我藏在桌下的書給你講吧)

對(duì)象優(yōu)先在Eden分配:new一個(gè)對(duì)象首先會(huì)放到Eden區(qū)中阅虫,當(dāng)Eden區(qū)域放滿了后,會(huì)將Eden區(qū)域中存活的對(duì)象放入到Survivor區(qū)中的S0區(qū)域不跟,然后將Eden區(qū)域清空颓帝,這個(gè)時(shí)候新new的對(duì)象還是放入Eden區(qū)域中,當(dāng)Eden區(qū)域中再次滿了的話就將Eden區(qū)域中的存活對(duì)象和S0中的存活對(duì)象都拿出來(lái)放入到S1區(qū)域中窝革,并將Eden區(qū)域和S0區(qū)域中都清理掉购城,當(dāng)Eden區(qū)域再次滿了就向Eden區(qū)域中的存活對(duì)象和S1中的存活對(duì)象一起放入到S0中,也就是循環(huán)將Eden區(qū)域中的存活對(duì)象和Survivor中的其中一塊區(qū)域中的存活對(duì)象一塊拿出來(lái)放入到Survivor中的另外一塊區(qū)域中虐译,如此循環(huán)瘪板,每循環(huán)一次對(duì)象的GC年齡加1,當(dāng)GC年齡到達(dá)15的時(shí)候就會(huì)移入到老年代漆诽。

放入老年代的時(shí)候的GC我們可以稱他為輕GC侮攀,這個(gè)GC的時(shí)間比較短,當(dāng)老年代滿了的時(shí)候會(huì)進(jìn)行重GC厢拭,這個(gè)GC的時(shí)間比較長(zhǎng)兰英。

長(zhǎng)期存活的對(duì)象進(jìn)入老年代:就是對(duì)象在年輕代來(lái)回循環(huán),到達(dá)15次(默認(rèn)供鸠,這個(gè)數(shù)值可以設(shè)置)畦贸,就會(huì)將對(duì)象放入老年代。

大對(duì)象直接進(jìn)入老年代:當(dāng)新創(chuàng)建的對(duì)象比較大的時(shí)候我們可以直接將他放入老年代楞捂,這樣可以避免在年輕代來(lái)回復(fù)制造成的額外開(kāi)銷薄坏,具體多大的對(duì)象是大對(duì)象我們可以根據(jù) -XX:PretenureSizeThreshold參數(shù)來(lái)設(shè)置趋厉。

動(dòng)態(tài)對(duì)象年齡判定:如果在Survivor空間中低于或等于某年齡的所有對(duì)象大小的總和大于Survivor空間的一半,那么年齡大于或等于該年齡的對(duì)象就可以直接進(jìn)入老年代胶坠,無(wú)需等到年齡達(dá)到15君账,假如現(xiàn)在最大的對(duì)象年齡為10,但是Survivor空間以及使用一半了涵但,如果再往下走可能還沒(méi)有對(duì)象達(dá)到15就造成Survivor區(qū)域滿了杈绸,所以就提前將大年齡的對(duì)象放入老年代了帖蔓。

空間分配擔(dān)保:在發(fā)生輕GC之前矮瘟,虛擬機(jī)就會(huì)先檢查老年代可用的空間是否大于新生代所有對(duì)象的總空間,如果大于塑娇,即便新生代所有的對(duì)象都不是垃圾對(duì)象澈侠,那么老年代也放的下,如果不大于呢埋酬?虛擬機(jī)會(huì)先查看是否設(shè)置了允許擔(dān)保失敗的參數(shù)哨啃,如果允許,虛擬機(jī)會(huì)判斷老年代的剩余空間是否大于歷次從新生代到老年代里的對(duì)象的平均大小写妥。

如果大于就會(huì)進(jìn)行輕GC將新生代的存活對(duì)象放入老年代拳球,這一次是冒險(xiǎn)的,因?yàn)橛锌赡苓@一次輕GC比之前輕GC的平均值存活的要多珍特,這樣會(huì)造成老年代內(nèi)存直接溢出祝峻。

如果小于就會(huì)先進(jìn)行一次重GC將老年代的空間騰出來(lái),保證可以將年輕代的存活對(duì)象放進(jìn)去扎筒。

如果配置的參數(shù)是不允許擔(dān)保失敗莱找,那么我們每一次到達(dá)老年代剩余的空間不夠新生代所有對(duì)象的總空間的時(shí)候我們就會(huì)進(jìn)行一次重GC將老年代的空間先騰出來(lái)。

面試官:可以啊嗜桌,小伙子有點(diǎn)東西

我:還行吧(有點(diǎn)東西你不給我倒點(diǎn)水喝奥溺。。骨宠。)

虛擬機(jī)性能監(jiān)控浮定、故障處理工具

面試官:剛才都是一些概念性的東西,現(xiàn)在問(wèn)你點(diǎn)實(shí)操的层亿,說(shuō)一下有哪些虛擬機(jī)性能監(jiān)控方法呢桦卒?

我:(剛想歇一會(huì)。棕所。闸盔。早知道簡(jiǎn)歷上寫精通Java虛擬機(jī)會(huì)被這么問(wèn)我就只寫了解Java虛擬機(jī)了,哎琳省。迎吵。躲撰。)

jps:虛擬機(jī)進(jìn)程狀態(tài)工具

命令格式:jps 【options】【hostid】

jps -l命令可以查看主類全名,如果進(jìn)程執(zhí)行的是jar包击费,則輸出jar路徑

jps -v命令可以查看虛擬機(jī)進(jìn)程啟動(dòng)時(shí)的JVM參數(shù)

jstat:虛擬機(jī)統(tǒng)計(jì)信息監(jiān)視工具

命令格式:jstat 【options】【hostid】【ms】【count】

參數(shù)ms和count代表查詢間隔和次數(shù)拢蛋,如果省略了這個(gè)2個(gè)參數(shù),說(shuō)明只查詢一次蔫巩,假設(shè)現(xiàn)在我們要查詢66320的垃圾收集情況谆棱,250毫秒查詢一次,一共查詢20次

jstat -gc 66320 250 20

jinfo:Java配置信息工具

jinfo的作用是實(shí)時(shí)查看和調(diào)整虛擬機(jī)各項(xiàng)參數(shù)圆仔。

jmap:Java內(nèi)存映像工具

jmap命令用于生成堆轉(zhuǎn)儲(chǔ)快照垃瞧。

jhat:虛擬機(jī)堆轉(zhuǎn)儲(chǔ)快照分析工具

jhat命令與jmap搭配使用,來(lái)分析jmap生成的堆轉(zhuǎn)儲(chǔ)快照坪郭。

jstack:Java堆棧跟蹤工具

jstack命令用于生成虛擬機(jī)當(dāng)前時(shí)刻的線程快照个从。

面試官:你這些都是命令,有哪些可視化的虛擬機(jī)故障處理工具嗎歪沃?

我:可以使用jdk自帶的VisualVM可視化工具

命令:jvisualvm

面試官:小伙子真厲害啊嗦锐,我這邊沒(méi)有什么要問(wèn)的了,你還有什么問(wèn)題要問(wèn)(面試官兩眼放光)

我:額沪曙。奕污。。面試官這個(gè)我的紙質(zhì)簡(jiǎn)歷可以給我嗎液走,可以不往我的簡(jiǎn)歷上寫寫畫畫嗎碳默,我明天的面試還要用。

面試官:還面啥別的公司啊育灸,就來(lái)我這吧腻窒,條件隨便開(kāi)

我:那就100k吧(此時(shí)面試官又拿起了他準(zhǔn)備好的棍子)

面試官:你要是不來(lái)就給我推薦一下,讓別人來(lái)我這面試一下

我:(此時(shí)我把我的深入理解Java虛擬機(jī)的書遞給了面試官磅崭,并告訴他)你先好好學(xué)習(xí)一下Java虛擬機(jī)吧儿子,今天幸虧只是我來(lái)了,如果是小奇的忠實(shí)讀者來(lái)了砸喻,你將會(huì)被虐的很慘的柔逼。(我轉(zhuǎn)身只留下了帥氣的背影)

總結(jié)

Java虛擬機(jī)是即基礎(chǔ)又有點(diǎn)深?yuàn)W的東西,所以大家要收藏后認(rèn)真反復(fù)的去學(xué)習(xí)割岛,如果覺(jué)得我的文章還不錯(cuò)的話就點(diǎn)個(gè)贊吧愉适,另外可以微信搜索【小奇JAVA面試】閱讀更多的好文章,獲取我為大家準(zhǔn)備的資料癣漆。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末维咸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌癌蓖,老刑警劉巖瞬哼,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異租副,居然都是意外死亡坐慰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門用僧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)结胀,“玉大人,你說(shuō)我怎么就攤上這事责循≡愀郏” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵沼死,是天一觀的道長(zhǎng)着逐。 經(jīng)常有香客問(wèn)我,道長(zhǎng)意蛀,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任健芭,我火速辦了婚禮县钥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘慈迈。我一直安慰自己若贮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布痒留。 她就那樣靜靜地躺著谴麦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伸头。 梳的紋絲不亂的頭發(fā)上匾效,一...
    開(kāi)封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音恤磷,去河邊找鬼面哼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛扫步,可吹牛的內(nèi)容都是我干的魔策。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼河胎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼闯袒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤政敢,失蹤者是張志新(化名)和其女友劉穎原茅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體堕仔,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡擂橘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了摩骨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片通贞。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖恼五,靈堂內(nèi)的尸體忽然破棺而出昌罩,到底是詐尸還是另有隱情,我是刑警寧澤灾馒,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布茎用,位于F島的核電站,受9級(jí)特大地震影響睬罗,放射性物質(zhì)發(fā)生泄漏轨功。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一容达、第九天 我趴在偏房一處隱蔽的房頂上張望古涧。 院中可真熱鬧,春花似錦花盐、人聲如沸羡滑。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)柒昏。三九已至,卻和暖如春熙揍,著一層夾襖步出監(jiān)牢的瞬間职祷,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工诈嘿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留堪旧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓奖亚,卻偏偏與公主長(zhǎng)得像淳梦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子昔字,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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