1. 程式人生 > >Netty 發生leak時需要解決的方法

Netty 發生leak時需要解決的方法

之前一直苦於無法解決這個問題,Netty應該結合MQ,分散式多端處理大量密集訊息,並且密集訊息有可能為耗時操作時,此方式極為有用。而當前方式為單端訊息處理,由執行緒池負責處理和分發壓力,所以存在可能的ByteBuf的leak問題。

https://netty.io/wiki/reference-counted-objects.html

Netty接收訊息後的異常為:

ERROR io.netty.util.ResourceLeakDetector - LEAK: ByteBuf.release() was not called before it's garbage-collected. See http://netty.io/wiki/reference-counted-objects.html for more information.
Recent access records: 4
#4:
	io.netty.buffer.AdvancedLeakAwareByteBuf.getBytes(AdvancedLeakAwareByteBuf.java:240)
	org.ginryan.udp.impl.core.GZipFirstHandler.channelRead(GZipFirstHandler.java:23)
	org.ginryan.udp.impl.core.NioDatagramThread$1$1.channelRead(NioDatagramThread.java:68)
	io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
	io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
	io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
	io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1359)
	io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
	io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
	io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:935)
	io.netty.channel.nio.AbstractNioMessageChannel$NioMessageUnsafe.read(AbstractNioMessageChannel.java:93)
	io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645)
	io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580)
	io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497)
	io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459)
	io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
	io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138)
	java.lang.Thread.run(Thread.java:748)
#3:
	Hint: 'NioDatagramThread$1$1#0' will handle the message from this point.
	io.netty.channel.DefaultAddressedEnvelope.touch(DefaultAddressedEnvelope.java:117)
	io.netty.channel.socket.DatagramPacket.touch(DatagramPacket.java:85)
	io.netty.channel.socket.DatagramPacket.touch(DatagramPacket.java:27)
	io.netty.channel.DefaultChannelPipeline.touch(DefaultChannelPipeline.java:116)
	io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345)
	io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
	io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1359)
	io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
	io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
	io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:935)
	io.netty.channel.nio.AbstractNioMessageChannel$NioMessageUnsafe.read(AbstractNioMessageChannel.java:93)
	io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645)
	io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580)
	io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497)
	io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459)
	io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
	io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138)
	java.lang.Thread.run(Thread.java:748)
#2:
	Hint: 'DefaultChannelPipeline$HeadContext#0' will handle the message from this point.
	io.netty.channel.DefaultAddressedEnvelope.touch(DefaultAddressedEnvelope.java:117)
	io.netty.channel.socket.DatagramPacket.touch(DatagramPacket.java:85)
	io.netty.channel.socket.DatagramPacket.touch(DatagramPacket.java:27)
	io.netty.channel.DefaultChannelPipeline.touch(DefaultChannelPipeline.java:116)
	io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345)
	io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:935)
	io.netty.channel.nio.AbstractNioMessageChannel$NioMessageUnsafe.read(AbstractNioMessageChannel.java:93)
	io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645)
	io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580)
	io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497)
	io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459)
	io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
	io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138)
	java.lang.Thread.run(Thread.java:748)
#1:
	io.netty.buffer.AdvancedLeakAwareByteBuf.internalNioBuffer(AdvancedLeakAwareByteBuf.java:732)
	io.netty.channel.socket.nio.NioDatagramChannel.doReadMessages(NioDatagramChannel.java:248)
	io.netty.channel.nio.AbstractNioMessageChannel$NioMessageUnsafe.read(AbstractNioMessageChannel.java:75)
	io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645)
	io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580)
	io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497)
	io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459)
	io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
	io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138)
	java.lang.Thread.run(Thread.java:748)
Created at:
	io.netty.buffer.PooledByteBufAllocator.newDirectBuffer(PooledByteBufAllocator.java:331)
	io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:181)
	io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:172)
	io.netty.buffer.AbstractByteBufAllocator.ioBuffer(AbstractByteBufAllocator.java:133)
	io.netty.channel.DefaultMaxMessagesRecvByteBufAllocator$MaxMessageHandle.allocate(DefaultMaxMessagesRecvByteBufAllocator.java:80)
	io.netty.channel.socket.nio.NioDatagramChannel.doReadMessages(NioDatagramChannel.java:244)
	io.netty.channel.nio.AbstractNioMessageChannel$NioMessageUnsafe.read(AbstractNioMessageChannel.java:75)
	io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645)
	io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580)
	io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497)
	io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459)
	io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
	io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138)
	java.lang.Thread.run(Thread.java:748)

相關推薦

Netty 發生leak需要解決方法

之前一直苦於無法解決這個問題,Netty應該結合MQ,分散式多端處理大量密集訊息,並且密集訊息有可能為耗時操作時,此方式極為有用。而當前方式為單端訊息處理,由執行緒池負責處理和分發壓力,所以存在可能的ByteBuf的leak問題。https://netty.io/wiki/r

Pycharm下執行除錯Python專案,當除錯既需要給除錯的程式傳入命令列引數又需要程式在設定的斷點處停下里檢視變數解決方法

  今天在除錯了一個複雜的Python專案,其中這個專案的除錯需要事先從命令列讀取引數,並且在除錯期間需要再事先設定的斷點處停下來。檢查相關的變數。   問題是,在Pycharm的Terminal 輸入檔名+引數後,程式就處於執行狀態,除非程式出錯,否則程式會一

MySQL遠程連接出現10061以及1045錯誤解決方法

linux mysql 遠程連接 root用戶 10061 1045 以前對於MySQL數據庫的管理基本都是在本地,今天了解到一個比較輕便,不需安裝,直接解壓可用的圖形界面管理工具HeidiSQL(下載地址:鏈接:http://pan.baidu.com/s/1nvuP2Et 密碼

關於項目受源代碼管理解決方法

出現 建議 代碼管理 cau 方法 ima log aux .com 從svn下載項目下來後,打開後可能會出現“..項目受源代碼管理。向源代碼註冊此項目時出錯,建議不要對此項目進行任何更改” ,如下圖 這個時候,用記事本方式打開這報錯項目的裏面的.csproj文件,找到下

"net start mysql"啟動MySQL服務報錯,提示發生系統錯誤5解決方法

在dos下執行”net start mysql”不能啟動MySQL服務! 提示發生系統錯誤 5;拒絕訪問!切換到管理員模式就可以啟動了。 一、錯誤截圖: 二、單次解決辦法 1、去”C:\Windows\System32”目錄找到”cmd.exe”: 2、右擊

MFC單文件生成多個CMFCToolbar需要解決的問題

1. 單文件預設生成的工具欄只有一個,但很多時候我們需要新增多個工具欄,比如: m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);m_wndFileToolBar.EnableDocking(CBRS_ALIGN_ANY);m_wndCalibrateT

使用Mybatis查詢,返回時間資料沒有分秒 解決方法

今天我在用mybatis查詢資料時,發現返回的時間資料只返回了日期  並沒有 ‘時’,‘分’,‘秒’。 後來我想到:Oralce的日期型別有很多種,Date ,Timestamp等,那是不是和我xml裡面配置的jdbcType型別有關, 1.檢查你的mysql資料表 &nbs

【java學習筆記】MyBatis中當實體類中的屬性名和表中的欄位名不一樣解決方法

在使用MyBatis開發DAO層時,當實體類中的屬性名和表中的欄位名不一樣時,查詢出來的值為null,此時有3種解決方法 解決方法1                在Mapper.xml對映檔案中,寫SQL語句時起別名 解決

Ubuntu下報錯:處理軟體包 python-dnspython (--configure)出錯 解決方法

原因: 在將python2升級到python3時,只是將/usr/local/bin目錄下修改了(使用ln -s 或者其他方式),然而我們的配置目錄並沒有修改。 解決方法: sudo apt-get clean sudo apt-get update sudo apt-get ins

關於.Net mvc 專案在本地vs執行響應時間過長無法訪問解決方法

  最近可能是剛升級了電腦使用了window10作業系統,總是遇到了一些以前沒有遇到過的事情! 今早來到公司本來準備寫bug的,但是當我開啟vs執行的時候發現今天的電腦響應的時間明顯的要比之前開啟網頁除錯的時間要長的多,到最後不但沒有開啟,而且還提示了一個這樣的問題! 如圖:    這就蛋

使用java連線Mongodb時報錯code:18codeName:AuthenticationFailed解決方法

連線資訊://MongoCredential.createScramSha1Credential()三個引數分別為 使用者名稱 資料庫名稱 密碼 MongoCredential credential = MongoCredential.createScramSha1Crede

phpStudy啟動失敗解決方法 提示缺vc9執行庫

php5.3、5.4和apache都是用vc9編譯,電腦必須安裝vc9執行庫才能執行。 php5.5、5.6是vc11編譯,如用php5.5、5.6必須安裝vc11執行庫。 php7.0、7.1是vc14編譯,如用php7.0、7.1必須安裝vc14執行庫。 ph

SQL Server 2008資料庫被標記為“可疑”解決方法

SQL Server 2008,某些資料庫某些時候會被標記為可疑 解決方法一: 1、修改資料庫為緊急模式 ALTER DATABASE University SET EMERGENCY 2、使資料庫變為單使用者模式 ALTER DATABASE Univer

Python+Selenium xpath 定位遇到相同元素解決方法父節點找子節點

1、#先定位到父節點,再從父節點找指定節點 例如:  注意不能直接用 driver.find_element_by_xpath('//*[@id="branch_inquiry"]').find_el

not syncing: Fatal exception錯誤解決方法

解決方法: 重啟進入BIOS,找找onboard lan controller,把這個設定為disabled就可以。 但是把這項禁止的話,估計上不了網,以上方法是暫時性的,並不是永久性的, 出現這種情況的時候最好換張光碟為最佳,禁止lan是逼不得已的。。。

PC端登入有道雲筆記出現網路錯誤提示解決方法

在使用有道雲筆記PC客戶端的過程中,部分使用者可能因為一些網路原因,登入時會被提示網路錯誤的問題。 遇到這樣的情況,請不要著急,我們在這裡整理了一些常見的處理方法。您可以嘗試這些方法自行排查問題並解決。 1.看一下IE瀏覽器(一定要是IE瀏覽器哦)能不能開啟網頁 某些代

用where in遇到null解決方法1

參考:https://www.2cto.com/database/201109/104960.html;http://ask.csdn.net/questions/6800061 :  SELECT* FROM華東 WHERE公司程式碼 IN ( SELECT 公司代 FRO

ffmpeg拉流rtmp音訊實時資料有延解決方法

在使用ffmpeg播放網路流中,在執行到avformat_stream_info函式會阻塞5秒左右,這樣造成播放等待時間過長,影響 使用者體驗,經試驗,修改函式裡面AVFormatContext引數,probesize和max_analyze_duration值大小 通過AVDictionary來改變

Navicat匯入mysql大資料出錯解決方法

Navicat 自己到處的資料,匯入時出現無法匯入的情況。 最後選擇利用MySQL命令匯入方式完成資料匯入 用到命令 use  快捷方式   \u      source 快捷方式   \. 快捷方式可以通過help查詢 mysql>\u dataname mysql

ant 執行到javac停止解決方法

在ant構建檔案上右擊,點選"run as"->"extenal toolsconfigurations", 最後,在執行配置裡,Common這個Tab頁裡,ConsoleEncoding設定編碼為UTF-8後,一切正常。 看來這個ConsoleEncoding不僅僅是顯示用的,而且在Ant執行的時候