GC

1.年輕代 Eden,S0,S1 。對(duì)象到一定年齡(minor gc次數(shù))晉升到老年代
2.老年代
3.永久代,方法區(qū),MetaSpace。存放類相關(guān)信息,靜態(tài)變量,常量等。

觸發(fā)FullGC:
1.老年代在一次major GC之后,內(nèi)存還是不夠,無(wú)法放入大對(duì)象或大數(shù)組,或者內(nèi)存碎片過(guò)多。
2.擔(dān)保失敗,年輕代進(jìn)入老年代之前,會(huì)統(tǒng)計(jì)平均每次晉升空間,如果平均晉升空間超過(guò)了老年代剩余空間,則觸發(fā)fullGC。
3.metaspace溢出??臻g不足,或者隨便太多無(wú)法繼續(xù)加載類對(duì)象。

promotion failed – concurrent mode failure
Minor GC后, Survivor空間容納不了剩余對(duì)象,將要放入老年代,老年代有碎片或者不能容納這些對(duì)象,就產(chǎn)生了concurrent mode failure, 然后進(jìn)行stop-the-world的Serial Old收集器。
解決辦法:-XX:UseCMSCompactAtFullCollection -XX:CMSFullGCBeforeCompaction=5 或者調(diào)大新生代或者Survivor空間

concurrent mode failure
CMS是和業(yè)務(wù)線程并發(fā)運(yùn)行的,在執(zhí)行CMS的過(guò)程中有業(yè)務(wù)對(duì)象需要在老年代直接分配,例如大對(duì)象,但是老年代沒(méi)有足夠的空間來(lái)分配,所以導(dǎo)致concurrent mode failure, 然后需要進(jìn)行stop-the-world的Serial Old收集器。

解決辦法:+XX:CMSInitiatingOccupancyFraction,調(diào)大老年帶的空間,+XX:CMSMaxAbortablePrecleanTime

總結(jié)一句話:使用標(biāo)記整理清除碎片和提早進(jìn)行CMS操作。

MetaSpace out of memory 導(dǎo)致fullGC排查:

1.Aviator包,google表達(dá)式計(jì)算引擎,AviatorEvaluator.execute或者AviatorEvaluator.complie方法通過(guò)asm生成對(duì)應(yīng)的Expression計(jì)算類,導(dǎo)致metaSpace中加載的類過(guò)多,MetaSpace溢出。解決方案是加緩存,AviatorEvalutor.execute("",cache:true) 當(dāng)遇到相同的表達(dá)式時(shí),不會(huì)重新生成類。
2.-verbose:class jvm啟動(dòng)參數(shù)。設(shè)置該參數(shù)可查看對(duì)應(yīng)的加載的類
3.-Dsun.reflect.inflationThreshold=2147483647 當(dāng)調(diào)用反射方法過(guò)多時(shí),jvm會(huì)進(jìn)行優(yōu)化,生成代理類來(lái)代替反射。指定該參數(shù),禁止生成代理類,一直調(diào)用反射方法,防止加載過(guò)多的類。
4.-XX:MetaspaceSize :該參數(shù)代表的不是Metaspace初始化的內(nèi)存大小。而是當(dāng)Metaspace大小接近該值時(shí),會(huì)進(jìn)行FullGC。jvm會(huì)根據(jù)另外兩個(gè)最高最低使用率來(lái)動(dòng)態(tài)調(diào)整MetaspaceSize大小。
-XX:MaxMetaspaceSize 超過(guò)該值時(shí)會(huì)報(bào)oom。
5.反射原理:默認(rèn)使用jni方式,通過(guò)調(diào)用native方法來(lái)調(diào)用。當(dāng)調(diào)用次數(shù)超過(guò)15次時(shí),生成GeneratorMethodAccessor實(shí)現(xiàn)具體的方法代理,然后通過(guò)sun.reflect.DelagatingClassLoader類加載器來(lái)加載代理類。Method中緩存著相關(guān)的數(shù)據(jù),都是弱引用(class對(duì)象中包含了method相關(guān)的信息,weakReference類型),當(dāng)內(nèi)存空間剩余較低時(shí)容易被回收,因此會(huì)重新創(chuàng)建類加載器來(lái)加載反射方法的代理類,這樣容易造成metaspace中有多個(gè)類加載器,正常web項(xiàng)目幾十個(gè)類加載器,但是resume-service排查時(shí)有兩千多個(gè)類加載器。另外一點(diǎn),類加載器在metaspace中是單獨(dú)分配內(nèi)存的,占用較大空間,無(wú)論該加載器是加載一個(gè)類還是多個(gè)類都會(huì)單獨(dú)分配內(nèi)存,所以造成很大的空間碎片,因此gc日志上看的,used140m,但是commited的內(nèi)存達(dá)到了256m。
6.JVM內(nèi)部為了實(shí)現(xiàn)高效分配,在類加載器第一次加載類的時(shí)候,會(huì)在Metaspace分配一個(gè)獨(dú)立的內(nèi)存塊,隨后該類加載加載的類信息都保存在該內(nèi)存塊。但如果這個(gè)類加載器只加載了一個(gè)類或者少數(shù)類,那這塊內(nèi)存就被浪費(fèi)了,如果類加載器又特別多,那內(nèi)存碎片就產(chǎn)生了。

// 1.2 獲取到Java進(jìn)程的pid,下述指令為sankuai用戶名后的數(shù)字,或者使用top指令查看Java的pid也可
ps -ef|grep java

// 1.3 dump出內(nèi)存快照,pid為1.2中查得的pid
jmap -dump:format=b,file=/xx/xx/xx.hprof pid

.MetaSpace中對(duì)象被回收的條件:

1、該類所有的實(shí)例都已經(jīng)被回收;
2、加載該類的ClassLoader已經(jīng)被回收;
3、該類對(duì)應(yīng)的java.lang.Class對(duì)象沒(méi)有任何地方被引用。

GC:

GCRoot

1.局部方法中的對(duì)象。
2.已經(jīng)加載的類的static中的對(duì)象。
3.方法區(qū)中常量應(yīng)用的對(duì)象
spring容器中的對(duì)象屬于哪一類???

模式

1.串行or并行:?jiǎn)尉€程或者多線程回收垃圾。
2.并發(fā)or Stop-the-world:回收過(guò)程中是否需要停止應(yīng)用。Stop-the-world過(guò)程中堆大小不再發(fā)生變化。

垃圾收集器

1.串行收集器:

1.年輕代:Eden,S0,S1。將Eden和S0中的存活對(duì)象移到S1中,如果S1內(nèi)存不夠,剩余對(duì)象直接進(jìn)入老年代。在每一次minorGC之前都會(huì)進(jìn)行一次判斷?;诮y(tǒng)計(jì),計(jì)算出每次年輕代晉升到老年代的平均大小,if (老年代剩余空間 < 平均大小) 觸發(fā) full gc。
2.老年代: 標(biāo)記->清除->壓縮

2.并行垃圾收集器:

1.年輕代:多線程STW+復(fù)制。
2.老年代:標(biāo)記->清除 ->壓縮。 單線程。與串行收集器相同。

3.并行壓縮收集器

1.年輕代:多線程STW+復(fù)制。
2.老年代:多線程 標(biāo)記->清除->壓縮。

CMS

1.年輕代:多線程STW+復(fù)制
2.老年代:initial mark (初始標(biāo)記,STW,確定GC root)+ current mark(并發(fā)標(biāo)記) + remark(STW,再標(biāo)記) + concurrent sweep(并發(fā)清理),不壓縮。
由于在并發(fā)清理過(guò)程中,可能會(huì)新產(chǎn)生一些垃圾(浮動(dòng)垃圾)導(dǎo)致老年代空間不足,concurrent mode failure,可以通過(guò)設(shè)置XX:CMSInitiatiingOccupancyFranction。提前讓老年代gc,jdk7默認(rèn)值68,jdk8之后調(diào)整成了92.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容