解決gateway報(bào)netty堆外內(nèi)存溢出io.netty.util.internal.OutOfDirectMemoryError
gateway報(bào)netty堆外內(nèi)存溢出io.netty.util.internal.OutOfDirectMemoryError
昨天線上網(wǎng)關(guān)突然無法訪問。打開日志看到錯(cuò)誤信息“io.netty.util.internal.OutOfDirectMemoryError” 堆外內(nèi)存溢出。。
這也沒碰到過啊,看來今天準(zhǔn)點(diǎn)下班的愿望又落空了。老規(guī)矩面向百度編程。
先看看網(wǎng)上有沒有其他兄弟碰到這個(gè)問題。
一頓搜索之后發(fā)現(xiàn),很多博客都是一知半解并不能解決我的問題。
但是大概得到一個(gè)信息,這bug是有netty導(dǎo)致的,一般是用了ByteBuf對(duì)象沒有調(diào)用release()釋放內(nèi)存。
但是項(xiàng)目代碼這么多如何排查具體的問題代碼呢?
我靈機(jī)一動(dòng),netty本身有沒有提供排查工具呢?
繼續(xù)百度發(fā)現(xiàn)Netty自身已經(jīng)自帶了內(nèi)存泄漏檢測(cè)工具,可用于檢測(cè)出ByteBuf對(duì)象被GC回收,但ByteBuf管理的內(nèi)存沒有釋放的情況(但不適用ByteBuf對(duì)象還沒被GC回收內(nèi)存泄漏的情況,例如任務(wù)隊(duì)列積壓)為了便于用戶發(fā)現(xiàn)內(nèi)存泄露
Netty提供4個(gè)檢測(cè)級(jí)別:
- disabled 完全關(guān)閉內(nèi)存泄露檢測(cè)
- simple 以約1%的抽樣率檢測(cè)是否泄露,默認(rèn)級(jí)別
- advanced 抽樣率同simple,但顯示詳細(xì)的泄露報(bào)告
- paranoid 抽樣率為100%,顯示報(bào)告信息同advanced
奶思!
本地把把項(xiàng)目跑起來,記得加JVM參數(shù) -Dio.netty.leakDetectionLevel=paranoid 開啟netty自帶檢測(cè),級(jí)別調(diào)到最高(火力全開?。?。
項(xiàng)目跑了不一會(huì)就看到了報(bào)錯(cuò)信息:

如上圖已經(jīng)提示了錯(cuò)誤發(fā)生的地方,自行去代碼中改就好。
一般是對(duì)于ByteBuf申請(qǐng)相關(guān)代碼的操作沒有加Release操作。
可通過在ReferenceCountUtil.safeRelease(buf);來釋放。
這時(shí)候大多數(shù)情況下的問題都解決了。秀兒我單純以為終于可以喝口茶準(zhǔn)備下班了。
事實(shí)證明,我的問題恰恰不在大部分里面。。。報(bào)錯(cuò)信息的位置都是在框架源碼中。我去哪里加release??
經(jīng)過一番激烈的研究(百度),應(yīng)該是依賴版本的bug。
升級(jí)下版本就好了
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.6.RELEASE</version>
升級(jí)到
<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>
升級(jí)到
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.2.8.RELEASE</version>
</dependency>
重啟,問題解決!
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Java在redis中進(jìn)行對(duì)象的緩存
這篇文章主要介紹了Java在redis中進(jìn)行對(duì)象的緩存,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
web項(xiàng)目WEB-INF下沒有web.xml的解決方法
新手如果在web項(xiàng)目創(chuàng)建后WEB-INF下面沒有出現(xiàn)web.xml,怎么辦?別慌,沒有web.xml文件的原因是因?yàn)樵趧?chuàng)建web項(xiàng)目的時(shí)候沒有把創(chuàng)建web.xml勾上。這篇文章主要介紹了web項(xiàng)目WEB-INF下沒有web.xml的解決方法,需要的朋友可以參考下2022-12-12
Java?List集合取交集的8種不同實(shí)現(xiàn)方式總結(jié)
工作中經(jīng)常遇到需要取兩個(gè)集合之間的交集、差集情況,下面這篇文章主要給大家總結(jié)介紹了關(guān)于Java?List集合取交集的8種不同實(shí)現(xiàn)方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04
Springboot 如何實(shí)現(xiàn)filter攔截token驗(yàn)證和跨域
這篇文章主要介紹了Springboot 如何實(shí)現(xiàn)filter攔截token驗(yàn)證和跨域操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
SpringMVC整合,出現(xiàn)注解沒有起作用的情況處理
這篇文章主要介紹了SpringMVC整合,出現(xiàn)注解沒有起作用的情況及處理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2023-05-05
詳解如何使用Java流API構(gòu)建樹形結(jié)構(gòu)數(shù)據(jù)
在實(shí)際開發(fā)中,構(gòu)建樹狀層次結(jié)構(gòu)是常見需求,本文主要為大家詳細(xì)介紹了如何使用Java 8 Stream API將扁平化的菜單數(shù)據(jù)轉(zhuǎn)換為具有層級(jí)關(guān)系的樹形結(jié)構(gòu),需要的可以參考下2024-04-04
Java 實(shí)現(xiàn)常見的非對(duì)稱加密算法
這篇文章主要介紹了Java 實(shí)現(xiàn)常見的非對(duì)稱加密算法,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-11-11

