netty框架出现错误LEAK: ByteBuf.release() was not called before it s garbage-collected. See https://netty.io/wiki/reference-counted-objects.html for more information.
LEAK: ByteBuf.release() was not called before it s garbage-collected. See https://netty.io/wiki/reference-counted-objects.html for more information.
最新在做一个物联网应用,项目到了后期,各个功能都能正常使用,只是通过日志发现,项目运行一段时间之后会出现内存泄露的错误。
解决历程
- 工具VisualVM
按照网上搜到的博客在本地下载了这个软件来分析内存的使用情况,因为我用的是mac,win的我就不知道了,下载软件之后,需要改一下配置文件,命令如下:
cd /Applications/VisualVM.app/Contents/Resources/visualvm/etc
vi visualvm.conf
找到visualvm_jdkhome把它取消注释,并且把它改为本机jdk的路径就可以打开软件了。
VisualVM的监控效果如下:
最终通过netty的官方文档找到了思路:主要是每次把服务端读到的消息都释放掉。不然会导致GC自动回收的时候这一部分资源始终没办法回收。
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception, IOException {
try {
...
} finally {
ReferenceCountUtil.release(msg);
}
}