netty LEAK: ByteBuf.release() was not called before it's garbage-collected
背景、netty抛出完整的error信息如下:
2018-02-08 14:30:43.098 [nioEventLoopGroup-5-1] ERROR io.netty.util.ResourceLeakDetector:176 - LEAK: ByteBuf.release() was not called before it's garbage-collected. Enable advanced leak reporting to find out where the leak occurred. To enable advanced leak reporting, specify the JVM option '-Dio.netty.leakDetection.level=advanced' or call ResourceLeakDetector.setLevel() See http://netty.io/wiki/reference-counted-objects.html for more information.
一、结论很直观:内存泄露了
再读读提示:获取更多的信息有两种方法
1. 增加启动jvm参数-Dio.netty.leakDetection.level=advanced
java -jar -Dio.netty.leakDetection.level=advanced your-server.jar
或者
java -jar -Dio.netty.leakDetectionLevel=ADVANCED your-server.jar
2. 在程序启动时增加相关日志信息
...省略代码...try {ServerBootstrap sbs = new ServerBootstrap().group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).handler(new LoggingHandler(LogLevel.INFO)).localAddress(new InetSocketAddress(port)).childHandler(new ChannelInitializer<SocketChannel>() {protected void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(new IdleStateHandler(10, 0, 0, TimeUnit.SECONDS));ch.pipeline().addLast(idleStateTrigger);ch.pipeline().addLast("decoder", new MessageDecoder());ch.pipeline().addLast("encoder", new MessageEncoder());ch.pipeline().addLast(serverHandler);};}).option(ChannelOption.SO_BACKLOG, 128).childOption(ChannelOption.SO_KEEPALIVE, true);ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.ADVANCED);ChannelFuture future = sbs.bind(port).sync();...省略代码...
二、这两种方式都能跟踪到内存泄露时的更多的抛出信息
Recent access records: 2 #2: io.netty.buffer.AdvancedLeakAwareByteBuf.readBytes(AdvancedLeakAwareByteBuf.java:498) io.netty.buffer.ByteBufInputStream.read(ByteBufInputStream.java:179) com.esotericsoftware.kryo.io.Input.fill(Input.java:164) com.esotericsoftware.kryo.io.Input.require(Input.java:196) com.esotericsoftware.kryo.io.Input.readVarInt(Input.java:373) com.esotericsoftware.kryo.util.DefaultClassResolver.readClass(DefaultClassResolver.java:127) com.esotericsoftware.kryo.Kryo.readClass(Kryo.java:693) com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:804) com.your.package.base.serialize.KryoSerializer.deserialize(KryoSerializer.java:54) com.your.package.base.link.MessageDecoder.decode(MessageDecoder.java:53) io.netty.handler.codec.LengthFieldBasedFrameDecoder.decode(...)
三、解决问题
分析日志,建议从自己的代码入手,然后将造成内存泄露的ByteBuf手动释放。
ReferenceCountUtil.release(byteBuf);
netty LEAK: ByteBuf.release() was not called before it's garbage-collected相关推荐
- Netty谈谈ByteBuf
前言 在网络传输过程中,字节是最基本也是最小的单元.JAVA NIO有提供一个ByteBuffer容器去装载这些数据,但是用起来会有点复杂,经常要在读写间进行切换以及不支持动态扩展等等.而netty为 ...
- Netty 的 ByteBuf 是如何支持 堆内存非池化 实现的
Netty的ByteBuf是如何支持堆内存非池化实现的 ByteBuffer 从实现方式上分成 HeapByteBuffer 和 DirectByteBuffer 两种内存实现方式, HeapByte ...
- Netty 教程 – ByteBuf详解
ByteBuffer存在的问题 ByteBuffer是JDK1.4中提供的java.nio.Buffer, 在内存中预留指定大小的存储空间来存放临时数据,其他Buffer的子类有:CharBuffer ...
- Netty(九)——ByteBuf源码之析
ByteBuf在Netty占据着中重要的位置,上篇<Netty--ByteBuf功能之说>讲了ByteBuf的工作原理和重要功能介绍.这篇从源码的角度来看ByteBuf.首先,来看一下主要 ...
- Netty之ByteBuf详解
1. ByteBuf的创建 在Netty中,有一个比较常见的对象ByteBuf,它其实等同于Java Nio中的ByteBuffer,但是ByteBuf对Nio中的ByteBuffer的功能做了很作增 ...
- Netty中ByteBuf 的零拷贝
转载:https://www.jianshu.com/p/1d1fa2fe1ed9 此文章已同步发布在我的 segmentfault 专栏. 根据 Wiki 对 Zero-copy 的定义: &quo ...
- Netty Associated -- ByteBuf
ByteBuf ByteBuf是Netty的Server与Client之间通信的数据传输载体.他提供了一个byte数组(byte[])的抽象视图 buffer创建 我们推荐通过一个Unpooled的帮 ...
- Netty中ByteBuf的copy、duplicate、slice方法对比
Jdk注释翻译 /** *返回ByteBuf的可读字节的拷贝.修改返回的ByteBuf内容与当前ByteBuf完全不会相互影响. *此方法不会修改当前ByteBuf的readerIndex或write ...
- vld for memory leak detector (release version)
有没有这样的情况,无法静态的通过启动和退出来查找内存泄露,比如网络游戏,你总不能直接关游戏那玩家怎么办? 现在vld支持release,我们可以动态的找. 1.在release版本使用vld了.< ...
- 【Netty4】netty ByteBuf (二) 引用计数对象(reference counted objects)
原文出处:http://netty.io/wiki/reference-counted-objects.html 相关文章: netty ByteBuf (一)如何创建ByteBuf对象 netty ...
最新文章
- 怎么读懂python语句_Python入门基础知识点总结,一点文章就能让你看懂Python
- 七、内存优化(4)性能计数器
- vue解决线上跨域的问题_vue前后端分离解决跨域问题
- SAP ABAP收货或者货物移动(MIGO,MB11,MB1A)在保存时候的增强点
- 华为鸿蒙OS合作方,华为发布鸿蒙OS元服务,超300家应用合作伙伴加入
- C#访问postgresql数据库类MyPostDB的实现
- 开源短地址_如何在短短5分钟内完成您的第一个开源贡献
- js获取a标签的value值_js逆向 | 某住房网跳转链接生成逻辑分析
- vue仿微博评论回复_Vue之 3.0升级
- C#代码实现矢量画图
- 当年上大学时,编程老师让我们用html+CSS实现一个天猫官网
- IT运维服务体系建设思路
- Android 音频源码分析——audioserver启动
- wincc c 语言改颜色,wincc常用c脚本小草设置
- mysql本地localhost连接不上
- 制作一个简单的音乐播放器
- HDU 3003 Pupu
- 详解拦截器和过滤器的区别
- mongo vue 破解
- 一、JavaScript回顾