日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

面试官:说一下你们线上JVM是如何优化的?一不小心聊了2个小时!!

發(fā)布時(shí)間:2023/12/8 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面试官:说一下你们线上JVM是如何优化的?一不小心聊了2个小时!! 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

面試官:說一下你們線上JVM是如何優(yōu)化的?一不小心聊了2個(gè)小時(shí)!!

說一JVM的內(nèi)存模型是什么樣子的?什么時(shí)候?qū)ο罂梢员皇栈?#xff1f;常見的垃圾回收器算法有哪些,各有什么優(yōu)劣?什么時(shí)候?qū)ο髸?huì)進(jìn)入老年代?什么是空間分配擔(dān)保策略?如何優(yōu)化減少Full
GC?

面對(duì)這一大波JVM面試題,你真的Hold住嗎?

這里把重要的知識(shí)點(diǎn)都寫出來了,不管是核心知識(shí)點(diǎn)也好還是面試題也好,讓大家對(duì)知識(shí)框架有個(gè)基本輪廓
同時(shí)也整理了283頁的PDF文檔,也是Java的核心知識(shí)點(diǎn)。
需要的朋友可以,點(diǎn)擊這里領(lǐng)取!!!,暗號(hào)是:CSDN

JVM的內(nèi)存模型是什么樣子的?

JVM內(nèi)存模型可以大致可劃分為線程私有區(qū)域和共享區(qū)域,線程私有區(qū)域由虛擬機(jī)棧、本地方法棧、程序計(jì)數(shù)器組成,而共享區(qū)域由堆、元數(shù)據(jù)空間(方法區(qū))組成。

再有人問你JVM的內(nèi)存模型就回想下上面的圖,但是知道JVM的內(nèi)存模型的樣子還是不行的,還要知道他們分別干什么的。

虛擬機(jī)棧/本地方法棧

當(dāng)你碰到過StackOverflowException這個(gè)異常的時(shí)候,有沒有思考下為什么會(huì)出現(xiàn)這樣的異常呢?答案就在虛擬機(jī)棧中,JVM會(huì)為每個(gè)方法生成棧幀然后將棧幀壓入虛擬機(jī)棧中。

舉個(gè)粟子:假設(shè)JVM參數(shù)-Xss設(shè)置為1m,如果某個(gè)方法里面創(chuàng)建一個(gè)128kb的數(shù)組,那這個(gè)方法在同一個(gè)線程中只能遞歸4次,再遞歸第五次的時(shí)候就會(huì)報(bào)StackOverflowException異常,因?yàn)樘摂M機(jī)棧的大小只有1m,每次遞歸都需要為方法在虛擬機(jī)棧中分配128kb的空間,很顯示到第五次的時(shí)候就空間不足了。

程序計(jì)數(shù)器

程序計(jì)數(shù)器是一個(gè)記錄著當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器。JVM的多線程是通過CPU時(shí)間片輪轉(zhuǎn)(即線程輪流切換并分配處理器執(zhí)行時(shí)間)算法來實(shí)現(xiàn)的。也就是說,某個(gè)線程在執(zhí)行過程中可能會(huì)因?yàn)闀r(shí)間片耗盡而被掛起,而另一個(gè)線程獲取到時(shí)間片開始執(zhí)行。

簡(jiǎn)單的說程序計(jì)數(shù)器的主要功能就是記錄著當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器。

方法區(qū)(元數(shù)據(jù)區(qū))

方法區(qū)存儲(chǔ)了類的元數(shù)據(jù)信息、靜態(tài)變量、常量等數(shù)據(jù)。

堆(heap)

平常大家使用new關(guān)鍵字創(chuàng)建的對(duì)象都會(huì)進(jìn)入堆中,堆也是GC重點(diǎn)照顧的區(qū)域,堆會(huì)被劃分為:新生代、老年代,而新生代還會(huì)被進(jìn)一步劃分為Eden區(qū)和Survivor區(qū):

新生代中的Eden區(qū)和Survivor區(qū),是根據(jù)JVM回收算法來的,只是現(xiàn)在大部分都是使用的分代回收算法,所以在介紹堆的時(shí)候會(huì)直接將新生代歸納為Eden區(qū)和Survivor區(qū)。

小結(jié)

JVM內(nèi)存模型小結(jié):

JVM內(nèi)存模型劃分為線程私有區(qū)域和共享區(qū)域虛擬機(jī)棧/本地方法棧負(fù)責(zé)存放線程執(zhí)行方法棧幀程序計(jì)數(shù)器用于記錄線程執(zhí)行指令的位置方法區(qū)(元數(shù)據(jù)區(qū))存儲(chǔ)類的元數(shù)據(jù)信息、靜態(tài)變量、常量等數(shù)據(jù)堆(heap)使用new關(guān)鍵字創(chuàng)建的對(duì)象都會(huì)進(jìn)入堆中,堆被劃分為新生代和老年代

什么時(shí)候?qū)ο罂梢员皇栈?#xff1f;

JVM判斷對(duì)象回收有兩種方式:引用記數(shù)、GC Roots,引用記數(shù)比較簡(jiǎn)單,JVM為每個(gè)對(duì)象維護(hù)一個(gè)引用計(jì)數(shù),假設(shè)A對(duì)象引用計(jì)數(shù)為零說明沒有任務(wù)對(duì)象引用A對(duì)象,那A對(duì)象就可以被回收了,但是引用計(jì)數(shù)有個(gè)缺點(diǎn)就是無法解決循環(huán)引用的問題。

GC Roots通過一系列的名為GC Roots的對(duì)象作為起始點(diǎn),從這些節(jié)點(diǎn)開始向下搜索,搜索過的路徑稱為引用鏈,當(dāng)一個(gè)對(duì)象到GC Roots沒有任何引用鏈相連時(shí),則證明對(duì)象是不可用的。

在Java中,可以作為GC Roots的對(duì)象包括下面幾種:

虛擬機(jī)棧中引用的對(duì)象;方法區(qū)中類靜態(tài)屬性引用的對(duì)象;方法區(qū)中的常量引用的對(duì)象;本地方法棧中JNI(即一般說的Native方法)的引用的對(duì)象;

小結(jié)

總的來說就是當(dāng)一個(gè)對(duì)象通過GC Roots搜索不到時(shí),說明對(duì)象可以被回收了,但什么時(shí)候回收還要看GC的心情!

常見的垃圾回收器算法有哪些,各有什么優(yōu)劣?

標(biāo)記清除

這種算法分兩分:標(biāo)記、清除兩個(gè)階段,
標(biāo)記階段是從根集合(GC Root)開始掃描,每到達(dá)一個(gè)對(duì)象就會(huì)標(biāo)記該對(duì)象為存活狀態(tài),清除階段在掃描完成之后將沒有標(biāo)記的對(duì)象給清除掉。

用一張圖說明:

這個(gè)算法有個(gè)缺陷就是會(huì)產(chǎn)生內(nèi)存碎片,如上圖B被清除掉后會(huì)留下一塊內(nèi)存區(qū)域,如果后面需要分配大的對(duì)象就會(huì)導(dǎo)致沒有連續(xù)的內(nèi)存可供使用。

標(biāo)記整理

標(biāo)記整理就沒有內(nèi)存碎片的問題了,也是從根集合(GC Root)開始掃描進(jìn)行標(biāo)記然后清除無用的對(duì)象,清除完成后它會(huì)整理內(nèi)存。

這樣內(nèi)存就是連續(xù)的了,但是產(chǎn)生的另外一個(gè)問題是:每次都得移動(dòng)對(duì)象,因此成本很高。

復(fù)制算法

復(fù)制算法會(huì)將JVM推分成二等分,如果堆設(shè)置的是1g,那使用復(fù)制算法的時(shí)候堆就會(huì)有被劃分為兩塊區(qū)域各512m。給對(duì)象分配內(nèi)存的時(shí)候總是使用其中的一塊來分配,分配滿了以后,GC就會(huì)進(jìn)行標(biāo)記,然后將存活的對(duì)象移動(dòng)到另外一塊空白的區(qū)域,然后清除掉所有沒有存活的對(duì)象,這樣重復(fù)的處理,始終就會(huì)有一塊空白的區(qū)域沒有被合理的利用到。

兩塊區(qū)域交替使用,最大問題就是會(huì)導(dǎo)致空間的浪費(fèi),現(xiàn)在堆內(nèi)存的使用率只有50%。

小結(jié)

JVM回收算法小結(jié):

標(biāo)記清除速度快,但是會(huì)產(chǎn)生內(nèi)存碎片;標(biāo)記整理解決了標(biāo)記清除內(nèi)存碎片的問題,但是每次都得移動(dòng)對(duì)象,因此成本很高;復(fù)制算法沒有內(nèi)存碎片也不需要移動(dòng)對(duì)象,但是導(dǎo)致空間的浪費(fèi);

什么時(shí)候?qū)ο髸?huì)進(jìn)入老年代?

新創(chuàng)建出來的對(duì)象一開始都會(huì)停留在新生代中,但隨著JVM的運(yùn)行,有些存活的長(zhǎng)的對(duì)象會(huì)慢慢的移動(dòng)到老年代中。

根據(jù)對(duì)象年齡

JVM會(huì)給對(duì)象增加一個(gè)年齡(age)的計(jì)數(shù)器,對(duì)象每“熬過”一次GC,年齡就要+1,待對(duì)象到達(dá)設(shè)置的閾值(默認(rèn)為15歲)就會(huì)被移移動(dòng)到老年代,可通過-XX:MaxTenuringThreshold調(diào)整這個(gè)閾值。

一次Minor GC后,對(duì)象年齡就會(huì)+1,達(dá)到閾值的對(duì)象就移動(dòng)到老年代,其他存活下來的對(duì)象會(huì)繼續(xù)保留在新生代中。

動(dòng)態(tài)年齡判斷

根據(jù)對(duì)象年齡有另外一個(gè)策略也會(huì)讓對(duì)象進(jìn)入老年代,不用等待15次GC之后進(jìn)入老年代,他的大致規(guī)則就是,假如當(dāng)前放對(duì)象的Survivor,一批對(duì)象的總大小大于這塊Survivor內(nèi)存的50%,那么大于這批對(duì)象年齡的對(duì)象,就可以直接進(jìn)入老年代了。


如圖上的A、B、D、E這四個(gè)對(duì)象,假如Survivor 2是100m,如果A + B + D的內(nèi)存大小超過50m,現(xiàn)在D的年齡是10,那E都會(huì)被移動(dòng)到老年代。實(shí)際上這個(gè)計(jì)算邏輯是這樣的:年齡1 + 年齡2 + 年齡n的多個(gè)對(duì)象總和超過Survivor區(qū)的50%,那就會(huì)把年齡n以上的對(duì)象都放入老年代。

大對(duì)象直接進(jìn)入老年代

如果設(shè)置了-XX:PretenureSizeThreshold這個(gè)參數(shù),那么如果你要?jiǎng)?chuàng)建的對(duì)象大于這個(gè)參數(shù)的值,比如分配一個(gè)超大的字節(jié)數(shù)組,此時(shí)就直接把這個(gè)大對(duì)象放入到老年代,不會(huì)經(jīng)過新生代。

這么做就可以避免大對(duì)象在新生代,屢次躲過GC,還得把他們來復(fù)制來復(fù)制去的,最后才進(jìn)入老年代,這么大的對(duì)象來回復(fù)制,是很耗費(fèi)時(shí)間的。

什么是空間分配擔(dān)保策略?

JVM在發(fā)生Minor GC之前,虛擬機(jī)會(huì)檢查老年代最大可用的連續(xù)空間是否大于新生代所有對(duì)象的總空間,如果大于,則此次Minor GC是安全的如果小于,則虛擬機(jī)會(huì)查看HandlePromotionFailure設(shè)置項(xiàng)的值是否允許擔(dān)保失敗。如果HandlePromotionFailure=true,那么會(huì)繼續(xù)檢查老年代最大可用連續(xù)空間是否大于歷次晉升到老年代的對(duì)象的平均大小,如果大于則嘗試進(jìn)行一次Minor GC,但這次Minor GC依然是有風(fēng)險(xiǎn)的;如果小于或者HandlePromotionFailure=false,則改為進(jìn)行一次Full GC。

如何優(yōu)化減少Full GC?

將前面的一些問題總結(jié)下來,然后應(yīng)用到線上,那JVM應(yīng)該如何優(yōu)化減少Full GC呢?以標(biāo)準(zhǔn)的4核8G機(jī)器為例說明,首先系統(tǒng)預(yù)留4G,其他4G按如下規(guī)則分配 :
?堆內(nèi)存:3g新生代:1.5g
?新生代Eden區(qū):1228m
?新生代Survivor區(qū):153m
?方法區(qū):256m
?虛擬機(jī)棧:1m/thread

設(shè)置參數(shù)如下:

-Xms3072m -Xmx3072m -Xmn1536m -Xss=1m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:HandlePromotionFailure -XX:SurvivorRatio=8


估算系統(tǒng)每秒占用內(nèi)存數(shù)量

在優(yōu)化JVM之前,要先估算要系統(tǒng)每秒占用的內(nèi)存數(shù)量,如有個(gè)日活百萬的商場(chǎng)系統(tǒng),每日下單量在20w左右,按照一天8個(gè)小時(shí)算,那訂單服務(wù)的每秒大概會(huì)有500個(gè)請(qǐng)求,然后粗略的估算下每個(gè)請(qǐng)求占用多少內(nèi)存,計(jì)算出每秒要花費(fèi)多少內(nèi)存。

假設(shè)是每秒500個(gè)請(qǐng)求,每個(gè)請(qǐng)求需要分配100k的空間,那1秒需要分配大約50m的內(nèi)存。

計(jì)算下多長(zhǎng)時(shí)間觸發(fā)一次Minor GC

按照之前的估算1秒需要分配大約50m的內(nèi)存的話,Eden區(qū)的空間是1228m那平均每25秒就要執(zhí)行一次Minor GC。

檢查下Survivor區(qū)是否足夠

按照上面的模型,每25秒就要執(zhí)行一次Minor GC,GC執(zhí)行期間并不能回收掉所有的新生代中的對(duì)象,那每秒50m那每次GC執(zhí)行期間還會(huì)剩下大約100m無法回收的對(duì)象會(huì)進(jìn)入Survivor區(qū),但是別忘記JVM有動(dòng)態(tài)年齡判斷機(jī)制,這樣設(shè)置下來Survivor的空間明顯小了一點(diǎn),所以將新生代設(shè)置2048m,才能避免觸發(fā)動(dòng)態(tài)年齡判斷:

-Xms3072m -Xmx3072m -Xmn2048m ...

大對(duì)象直接進(jìn)入老年代

大對(duì)象一般是長(zhǎng)期存活和使用的對(duì)象,一般來說設(shè)置1M的對(duì)象直接進(jìn)入老年代,這樣避免大對(duì)象一直處于新生代中來回復(fù)制,所以加上PretenureSizeThreshold=1m參數(shù)。

... -XX:PretenureSizeThreshold=1m ...

合理設(shè)置對(duì)象年齡閾值

Minor GC后默認(rèn)躲過15次垃圾回收后自動(dòng)升入老年代,按照我們的評(píng)估25秒觸發(fā)一次Minor GC,如果按照MaxTenuringThreshold參數(shù)的默認(rèn)值,躲過15次GC后,應(yīng)該是6分鐘之后的事了,結(jié)合當(dāng)前業(yè)務(wù)場(chǎng)景這里可以降低一點(diǎn),讓那些本應(yīng)該進(jìn)入老年代的對(duì)象,盡快的進(jìn)入老年代,避免復(fù)制成本和浪費(fèi)新生代空間,從而導(dǎo)致新生代Survivor空間不足,引發(fā)Full GC。

... -XX:MaxTenuringThreshold=6 ...

總結(jié)

以上所述是給大家介紹的大廠面試經(jīng):說一下你們線上JVM是如何優(yōu)化的,希望對(duì)大家有所幫助

總結(jié)

以上是生活随笔為你收集整理的面试官:说一下你们线上JVM是如何优化的?一不小心聊了2个小时!!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩欧美中文字幕一区二区三区 | 日日噜| 国产一区二区三区在线看 | 国产精品亚洲综合 | 天天干夜夜欢 | 六月丁香激情网 | 亚洲国产aⅴ精品一区二区 日韩黄色在线视频 | 亚洲高清无码久久久 | 亚洲黄网av| 激情内射亚洲一区二区三区爱妻 | 久久精品66 | 漂亮人妻被中出中文字幕 | av手机 | 欧洲一二三区 | 日韩欧美高清视频 | 一区二区三区四区国产精品 | 日本成人精品在线 | 在线中文字幕一区二区 | 人民的名义第二部 | 在线观看涩涩 | 国产女主播一区 | 在线免费观看一区二区三区 | 成人午夜精品 | 九七伦理电影 | 免费搞黄网站 | 午夜xxxx| 久久这里只精品 | 99re6这里只有精品 | www.欧美| 极品美妇后花庭翘臀娇吟小说 | 69人妻精品久久无人专区 | 黑人黄色一级片 | 在线一区二区不卡 | 一级黄色免费视频 | 丝袜老师办公室里做好紧好爽 | 伊人久久大香线蕉av一区 | 日本亚洲高清 | 看片免费黄在线观看入口 | 伊人称影院 | 亚洲 欧美 国产 另类 | a级黄色录像 | 韩国三级视频在线 | 人妻在线一区 | 成人午夜黄色 | 黄色天堂| 国产探花在线精品一区二区 | 精品久久香蕉国产线看观看亚洲 | 欧美插插视频 | 美女隐私直播 | 亚洲午夜网站 | 夜夜夜夜夜操 | 国产精品免费av一区二区 | 香蕉成人网 | 欧美激情在线一区 | 黄色香蕉网站 | www.com操| 欧美一级大片在线观看 | 麻豆影片 | 在线观看色网站 | 日本美女动态 | 午夜激情视频在线观看 | 亚洲av无码国产精品麻豆天美 | av在线毛片| 欧美大片黄 | 操夜夜| 亚洲人午夜精品 | 一二三不卡视频 | 精品国产视频在线 | 樱花影院电视剧免费 | 91久久精品美女高潮 | 成人网页 | 中文人妻熟妇乱又伦精品 | 精品久久久久久中文字幕 | 麻豆视屏 | 黄色一级免费看 | 欧美亚洲国产一区 | 青青啪啪 | 一本大道综合伊人精品热热 | 精品福利影院 | 91在线亚洲 | 欧美一二三区 | 尤物视频免费在线观看 | 成人免费视频网站在线观看 | 岛国av一区| 人与性动交zzzzbbbb | 蜜桃视频日韩 | 亚洲欧美在线视频 | 国产精品aaa | 国产老女人乱淫免费 | 麻豆精品免费视频 | 六月色播 | 一区二区三区免费高清视频 | 亚洲国产一区二区三区a毛片 | 黄视频免费在线看 | 手机看片久久 | 在线观看免费毛片 | 中文字幕视频免费观看 | 91啦丨九色丨刺激 | 成人动漫在线播放 |