昨天線上網(wǎng)關(guān)突然無法訪問。打開日志看到錯誤信息“io.netty.util.internal.OutOfDirectMemoryError” 堆外內(nèi)存溢出。。這也沒碰到過啊,看來今天準(zhǔn)點(diǎn)下班的愿望又落空了。老規(guī)矩面向百度編程。先看看網(wǎng)上有沒有其他兄弟碰到這個問題。一頓搜索之后發(fā)現(xiàn),很多博客都是一知半解并不能解決我的問題。但是大概得到一個信息,這bug是有netty導(dǎo)致的,一般是用了ByteBuf對象沒有調(diào)用release()釋放內(nèi)存。
但是項(xiàng)目代碼這么多如何排查具體的問題代碼呢?我靈機(jī)一動,netty本身有沒有提供排查工具呢?繼續(xù)百度發(fā)現(xiàn)Netty自身已經(jīng)自帶了內(nèi)存泄漏檢測工具,可用于檢測出ByteBuf對象被GC回收,但ByteBuf管理的內(nèi)存沒有釋放的情況(但不適用ByteBuf對象還沒被GC回收內(nèi)存泄漏的情況,例如任務(wù)隊(duì)列積壓)為了便于用戶發(fā)現(xiàn)內(nèi)存泄露,Netty提供4個檢測級別:
disabled 完全關(guān)閉內(nèi)存泄露檢測
simple ?以約1%的抽樣率檢測是否泄露,默認(rèn)級別
advanced ?抽樣率同simple,但顯示詳細(xì)的泄露報告
paranoid 抽樣率為100%,顯示報告信息同advanced
奶思!
本地把把項(xiàng)目跑起來,記得加JVM參數(shù)?-Dio.netty.leakDetectionLevel=paranoid 開啟netty自帶檢測,級別調(diào)到最高(火力全開?。?。項(xiàng)目跑了不一會就看到了報錯信息:
如上圖已經(jīng)提示了錯誤發(fā)生的地方,自行去代碼中改就好。一般是對于ByteBuf申請相關(guān)代碼的操作沒有加Release操作??赏ㄟ^在ReferenceCountUtil.safeRelease(buf);來釋放。
??這時候大多數(shù)情況下的問題都解決了。秀兒我單純以為終于可以喝口茶準(zhǔn)備下班了。
?事實(shí)證明,我的問題恰恰不在大部分里面。。。報錯信息的位置都是在框架源碼中。我去哪里加release??
經(jīng)過一番激烈的研究(百度),應(yīng)該是依賴版本的bug。升級下版本就好了。
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.6.RELEASE</version>
升級到
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.13.RELEASE</version>
?
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> <version>2.2.5.RELEASE</version> </dependency>
升級到文章來源:http://www.zghlxwxcb.cn/news/detail-496920.html
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> <version>2.2.8.RELEASE</version> </dependency>
重啟,問題解決!文章來源地址http://www.zghlxwxcb.cn/news/detail-496920.html
到了這里,關(guān)于gateway報 netty堆外內(nèi)存溢出問題解決io.netty.util.internal.OutOfDirectMemoryError的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!