记一次内存泄漏
项目在运行过程中,平均隔两天内存就满,导致服务崩溃。用jconsole对内存进行监测,发现内存在不停地长,然后用MAT分析详细堆栈信息,定位到内存泄漏的代码。
报错信息:
ERROR|nioEventLoopGroup...|LEAK:ByteBuf.release() was not called before its garbage-collected
Recent access records:
Create at:
io.netty.buffer.AbstractByteBufAllocator.compositeHeapBuffer(AbstractByteBufAllocator.java:xxx)
io.netty.buffer.AbstractByteBufAllocator.compositeHeapBuffer(AbstractByteBufAllocator.java:xxx)
io.netty.buffer.AbstractByteBufAllocator.compositeBuffer(AbstractByteBufAllocator.java:xxx)
...
原因:异步线程里边Netty的webSocket连接部分没有释放
解决办法:在websocket里边捕获异常、writeAndFlush时将TextWebSocketFrame.release()一下