作者簡(jiǎn)介:大家好,我是smart哥,前中興通訊、美團(tuán)架構(gòu)師,現(xiàn)某互聯(lián)網(wǎng)公司CTO
聯(lián)系qq:184480602,加我進(jìn)群,大家一起學(xué)習(xí),一起進(jìn)步,一起對(duì)抗互聯(lián)網(wǎng)寒冬
學(xué)習(xí)必須往深處挖,挖的越深,基礎(chǔ)越扎實(shí)!
階段1、深入多線程
階段2、深入多線程設(shè)計(jì)模式
階段3、深入juc源碼解析
階段4、深入jdk其余源碼解析
階段5、深入jvm源碼解析
一、案例背景
本案例的背景是一個(gè)高峰期每秒十萬(wàn)QPS的社交APP,這類APP流量最大的模塊就是個(gè)人主頁(yè)模塊,會(huì)有大量的用戶在一個(gè)集中的時(shí)間段內(nèi)(比如晚上)頻繁訪問(wèn)各種個(gè)人主頁(yè)數(shù)據(jù),而且個(gè)人主頁(yè)的數(shù)據(jù)量通常比較大,在幾MB左右:
1.1 存在問(wèn)題
上述案例,由于高峰期的每秒并發(fā)量太高,所以新生代的Eden區(qū)會(huì)被迅速占滿,頻發(fā)觸發(fā)Young GC。而在Young GC的時(shí)候,下一秒的請(qǐng)求又來(lái)了,導(dǎo)致很多請(qǐng)求是還沒(méi)來(lái)得及處理完的,導(dǎo)致每次Young GC的時(shí)候很多對(duì)象需要存活下來(lái),因此在高峰期經(jīng)常會(huì)出現(xiàn)存活對(duì)象太多,導(dǎo)致Survivor區(qū)放不下的問(wèn)題:
所以,此時(shí)就會(huì)有大量對(duì)象頻繁進(jìn)入老年代,從而頻繁觸發(fā)老年代的GC:
二、內(nèi)存碎片
2.1 優(yōu)化前
我們先來(lái)看下系統(tǒng)優(yōu)化前的一些關(guān)鍵JVM參數(shù):-XX:UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=5
上述采用CMS對(duì)老年代進(jìn)行垃圾回收,默認(rèn)為標(biāo)記-清除算法,所以每次GC后都會(huì)出現(xiàn)許多內(nèi)存碎片。
我們來(lái)看下整個(gè)流程,首先老年代中有許多垃圾對(duì)象:
CMS回收掉一些垃圾對(duì)象后,就會(huì)出現(xiàn)內(nèi)存碎片,由于-XX:CMSFullGCsBeforeCompaction=5
,所以5次Full GC之后才會(huì)進(jìn)行內(nèi)存碎片整理:
但是,大家考慮一個(gè)場(chǎng)景,一次Full GC之后,老年代中有一部分內(nèi)存里都是大量的內(nèi)存碎片,只有部分可用的連續(xù)空間。這時(shí)候,隨著大量對(duì)象進(jìn)入老年代,一旦連續(xù)可用空間不足以容納這些對(duì)象,就會(huì)導(dǎo)致立馬觸發(fā)下一次Full GC。
這樣,隨著一次次Full GC,導(dǎo)致老年代產(chǎn)生更多的內(nèi)存碎片,觸發(fā)下一次Full GC的速度也會(huì)越來(lái)越快,直到5次Full GC之后才會(huì)去整理內(nèi)存碎片。
2.2 優(yōu)化后
這個(gè)案例的優(yōu)化,其實(shí)非常簡(jiǎn)單。首先,可以用jstat
分析下JVM的運(yùn)行情況,判斷出每次Young GC后存活對(duì)象的大小,然后增加Survivor區(qū)的大小,避免存活對(duì)象頻繁進(jìn)入老年代。
另外,優(yōu)化后部分對(duì)象還是慢慢會(huì)進(jìn)入老年代,畢竟系統(tǒng)的負(fù)載很高,所以調(diào)優(yōu)后每小時(shí)還是會(huì)有一次Full GC。
所以,第二個(gè)優(yōu)化點(diǎn)就是?針對(duì)CMS內(nèi)存碎片問(wèn)題進(jìn)行優(yōu)化?。在降低了Full GC的頻率后,務(wù)必設(shè)置以下參數(shù),使得每次Full GC后都進(jìn)行內(nèi)存碎片整理:-XX:UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0
這樣雖然每次Full GC的內(nèi)存碎片整理需要消耗更多的時(shí)間,但是跟頻繁Full GC的時(shí)間消耗相比,效率會(huì)提升很多。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-801278.html
三、總結(jié)
本章,我們通過(guò)示例分析了頻繁Full GC導(dǎo)致的內(nèi)存碎片問(wèn)題,通過(guò)參數(shù)-XX:CMSFullGCsBeforeCompaction
可以配置內(nèi)存碎片整理的次數(shù),從而提升系統(tǒng)的運(yùn)行效率。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-801278.html
到了這里,關(guān)于JVM實(shí)戰(zhàn)(23)——內(nèi)存碎片優(yōu)化的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!