問題描述
- 線上生產(chǎn)機器fullgc很頻繁幾乎一分鐘一次蛙吏,younggc確無兄一。
問題分析
- fullgc頻繁第一反應(yīng)是大對象導(dǎo)致的洲赵,但是這次上線版本改動內(nèi)容也只是微小改動鸳惯,并沒有大改動,不太可能產(chǎn)生大對象叠萍,而且younggc為空很不正常悲敷。
- 看異常日志的時候看到提示gc之前沒有調(diào)用ByteBuf.release(netty默認泄露檢測級別下,按照1%的比例來抽查俭令,所以過了一會才打出這一條日志)后德。根據(jù)日志提示設(shè)置jvm參數(shù)-Dio.netty.leakDetection.level=advanced,該參數(shù)級別設(shè)置后會打印詳細發(fā)生泄露的地方抄腔,排查之后發(fā)現(xiàn)每次調(diào)用時都使用直接內(nèi)存分配瓢湃,代碼本質(zhì)是想獲取直接內(nèi)存引用的。
- 這個接口調(diào)用很頻繁赫蛇,雖然每次直接內(nèi)存分配不大绵患,但很快就達到1個g,堆外內(nèi)存在分配的時候悟耘,會有一個閾值落蝙,可以通過MaxDirectMemory參數(shù)設(shè)置,默認為Xmx減去一個suvivor大小暂幼。當(dāng)快達到該閾值的時候筏勒,會調(diào)用一把System.gc主動觸發(fā)一把fullgc,我們沒有設(shè)置DisableExplictGC這個參數(shù)旺嬉,所以System.gc是有效的管行。
- 查看線上堆外內(nèi)存的使用與fullgc的回收發(fā)現(xiàn)節(jié)奏比較吻合。younggc沒有是因為young區(qū)分配 的比較大邪媳,還沒來得及回收就隨著被fullgc掉了捐顷。