標題採自:英雄聯盟-瑞文:斷劍重鑄之日,騎士歸來之時!
前兩天早上在擠地鐵的時候看到小組群裡,主管發了好多訊息,開啟來一看,說是xx專案自從22號發版後,每天晚上就瘋狂full gc,讓我們查一下什麼原因,嘻嘻嘻,一開始聽到,心裡竊喜,為什麼呢。因為自己以前對jvm也有些了解,不過都只是紙上談兵罷了。現在剛好有機會,到公司就和小夥伴開始排查。以下是full gc的
圖 - 1.0
圖 - 2.0
圖 - 3.0
當然這是運維給出來的,一開始看到這個,我是懵逼的,這tm是什麼。接著往下看:運維又給出了如下圖的dump日誌
圖- 4.0
我心裡又問,這tm是什麼。哇,一臉懵逼的我,又去補了jvm的記憶體模型。
就在我補給的時候,有個大佬已經發言了,
圖 -5.0
又一位大佬說:圖-6.0 應該就是這塊了
圖- 6.0
主管又說:雖然是老**,但是以前沒發生過這樣的問題,但是自從22號發版後就開始了,她就檢視了一下22號有關assostantsdto 這塊有關的**,並截屏發了出來
圖-7.0
看到發出來的這段,上面有我的署名 ouyangkang modify,我先是臉部發燙,然後大腦空白,接著回魂。我????? 寫的。emmmm............。有點印象,這段**有問題?看下綠色的那段我改的**,
首先獲取到乙個list物件,遍歷該list,給list容器中的物件賦值,並重新把該物件新增list容器中,乍看一下,沒問題啊,這段**。emm............................
仔細再看下綠色的那段我改的**:
首先獲取到乙個list物件,遍歷該list,給list容器中的物件賦值,並重新把該物件新增list容器中。等等,重新新增到list容器中,那麼該list容器的大小不就也更大嗎,那麼又會進行一次迴圈,這不發生了死迴圈嗎。哇!! 這就很有意思了,我的鍋,我的鍋。
那麼怎麼改呢:
第二種方案:list.set(i,assistantsdto) 將改dto替換。
專案重新發版,果然這幾天xx專案再也沒有出現頻繁的full gc了。
解釋斷劍中圖中含義:如果能夠看懂前面幾張圖的這節就可以跳過了。圖1.0就不解釋了,首先圖-2.0中第一行
60208.152(時間戳),[full gc(ergonomics)(解釋:發生了什麼gc)4035169k(解釋:jvm堆中記憶體已用大小)->3635904(解釋:經過full gc**堆中記憶體後,堆中還剩餘的記憶體大小) (4178944k(解釋:jvm堆的總記憶體大小))]
從圖-1.0 中可以看出,經過乙個full gc後,堆中可用記憶體還是不多,並且發生了很多次full gc。我們都知道full gc就是stop the word 連續的full gc 。那麼就導致這個專案不再對外提供服務了。
大概說一下gc有哪幾種**策略,詳情網上都有,自行檢視,我就不寫了(偷懶),算了,我還是寫了點。
minor gc: 發生在年輕代。
一開始:當eden區物件寫滿的時候,發生minor gc,把存活物件放到s0,釋放其他物件所佔記憶體,繼續執行,eden區又寫滿了,發生minor gc,**eden區和s0區存活物件,把存活物件防止s1,釋放其他物件所佔記憶體。eden區又寫滿了,發生minor gc,**eden區和s1區存活物件,把存活物件防止s0,釋放其他物件所佔記憶體。反反覆覆,比較老一點的物件就放到了老年代。
major gc:發生在老年代:eg: 當發生minor gc 的時候,想把存活的老物件放到老年代,但是沒有這麼大的連續記憶體空間,此時就會發生major gc
full gc: 發生在年輕代和老年代 : eg: 當老年代和新生代記憶體都寫的快滿了的時候就會發生full gc|
大概說一下jvm記憶體模型:下次寫篇blog單獨介紹一下吧 。先欠著
我擷取部分進行解釋:
s0c :survivor0 可用記憶體大小 。 s1c: survivor1可用記憶體大小
s0u:survivor0 已用記憶體大小 s1u :survivor1已用記憶體大小
ec: eden可用記憶體大小 eu:eden 已用記憶體大小
oc: 老年代可用記憶體大小 ou:老年代已用記憶體大小
mc:方法區可用記憶體大小 mu:方法區已用記憶體大小
ccsc :壓縮類空間記憶體大小 ccsu:壓縮類空間已用記憶體帶下
ygc: 年輕代垃圾**次數 ygct:young gc消耗的時間
fgc:full gc **次數 fgc:full gc 消耗的時間
gct : gc 消耗的時間
如果我不寫騎士歸來之時,強迫症是不是會很難受。那麼就推薦一下,留個言,我大聲講出來。
一次線上oom問題記錄
某天早上發現服務無法正常訪問,於是展開問題排查。1。首先檢視日誌,發現有oom日誌存在。這時候看到oom,犯了想當然的錯誤,認為是記憶體不足,堆記憶體空間已經用完。於是檢視 發現某個模組中有如下 誰寫的,站出來,我保證不打你。當時盲目的認為就是使用這個執行緒池的問題 關於此執行緒池的弊端不再贅述 於...
一次奇葩Hama問題記錄
對hama進行改進,引用了乙個類a a繼承了執行緒類 當該類實現如下時,graphjobrunner 中 override public final void setup bsppeerpeer throws ioexception,syncexception,interruptedexceptio...
yaf路由解析錯誤一次問題記錄
nginx伺服器,部分配置如下 location location php 然後yaf的所有請求路由解析之後均預設指向了index控制器index方法,即為預設方法 當把path info模式關閉,即注釋掉之後,則yaf的路由解析正常 path info是乙個cgi的標準,可以用來做為傳參載體。pa...