偶然一次再测试环境看到netty出现内存泄漏的日志,报错信息如下:

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.leakDetectionLevel=advanced' or call ResourceLeakDetector.setLevel()

看到这个错误,看不出内存泄漏的位置。但在环境里也没有设置

-Dio.netty.leakDetectionLevel=advanced

这个问题在测试环境出现还好,如果在生产环境那就糟糕了。所以怎么可以今早在开发过程中就发现以及定位到内存泄漏的问题呢?

Netty的内存泄漏检测分为四个级别:

DISABLED - 完成禁止检测内存泄漏,这个是不推荐。

SIMPLE - 如果buffer中出现1%的内存泄漏,打印错误日志,就是上面那样。但是日志是看不到详细在什么位置出现了内存泄漏。鉴于性能考虑,这个是在生产环境中默认使用。

ADVANCED - 如果buffer的1%出现内存泄漏,打印错误,并且输出详细的内存泄漏信息。

PARANOID - 这个和ADVANCED输出的内容是一样的,但它会对每一次请求的buffer做检查。很适用于调试和单元测试。

建议

1、为了今早的发现问题,强烈建议在开发调试过程中,把检测级别设为PARANOID,设置:

io.netty.leakDetection.level=PARANOID

2、谨记哪里消费buffer,哪里释放,即调用ReferenceCountUtil.release(msg)

public void channelRead(ChannelHandlerContext ctx, Object msg) {

try {

...

} finally {

ReferenceCountUtil.release(msg);

}

}

输出的详细信息示例

可以看出在EchoServerHandler上出现了内存泄漏。

12:05:24.374 [nioEventLoop-1-1] ERROR io.netty.util.ResourceLeakDetector - LEAK: ByteBuf.release() was not called before it's garbage-collected.

Recent access records: 2

#2:

Hint: 'EchoServerHandler#0' will handle the message from this point.

io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:329)

io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:846)

io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:133)

io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:485)

io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:452)

io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:346)

io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:794)

java.lang.Thread.run(Thread.java:744)

#1:

io.netty.buffer.AdvancedLeakAwareByteBuf.writeBytes(AdvancedLeakAwareByteBuf.java:589)

io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:208)

io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:125)

io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:485)

io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:452)

io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:346)

io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:794)

java.lang.Thread.run(Thread.java:744)

Created at:

io.netty.buffer.UnpooledByteBufAllocator.newDirectBuffer(UnpooledByteBufAllocator.java:55)

io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:155)

io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:146)

io.netty.buffer.AbstractByteBufAllocator.ioBuffer(AbstractByteBufAllocator.java:107)

io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:123)

io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:485)

io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:452)

io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:346)

io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:794)

java.lang.Thread.run(Thread.java:744)

java netty 内存泄露_Netty开发调试设置io.netty.leakDetection.level=PARANOID定位内存泄漏问题...相关推荐

  1. android如何避免内存泄露,Android开发中应该避免的内存泄露

    一.背景和目的: 目前许多开发人员在Android开发过程中,较少关注实现细节和内存使用,容易会造成内存泄露,导致程序OOM. 本文会通过代码向大家介绍在Android开发过程中常见的内存泄露. 二. ...

  2. socket 收不到netty客户端消息_Netty开发 —— 首个demo学习

    1. 编写服务端代码 编写业务逻辑:读取到客户端的消息时候,打印客户端消息,并给客户端回复一条消息 import io.netty.bootstrap.ServerBootstrap; import ...

  3. android的内存泄露有几种,Android中几种有可能会导致内存泄露的情况

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 1.Static静态成员导致的内存泄露 将占用大量内存空间的变量声明为static静态类型.当Activity被销毁的时 ...

  4. python 类变量 none 内存泄露_Python中使用自定义类class作为海量数据结构时内存占用巨大的问题...

    最近碰到处理一个二十多兆的文件时内存蹭蹭的吃掉四百多兆,吓死宝宝了. 无奈毕竟接触python时间有限,还没有完整的看过python的一些基础知识,我想一个合格的pythoner应该不会碰到这个问题. ...

  5. 内存泄露检测方案和代码实现

    文章目录 1 内存泄露核心及原因 2 内存泄露的危害 3 常用的检查内存泄露的工具 4 内存泄露检测的4种方案和代码实现 内存泄露检测围绕两个问题解决 定位到代码中行的方法 方法1 方法2 方法3 ( ...

  6. java nio 李林峰_Netty堆外内存泄漏排查,这一篇全讲清楚了

    上篇文章介绍了Netty内存模型原理,由于Netty在使用不当会导致堆外内存泄漏,网上关于这方面的资料比较少,所以写下这篇文章,专门介绍排查Netty堆外内存相关的知识点,诊断工具,以及排查思路提供参 ...

  7. 彻底搞懂Java内存泄露

    Java内存回收方式 Java判断对象是否可以回收使用的而是可达性分析算法. 在主流的商用程序语言中(Java和C#),都是使用可达性分析算法判断对象是否存活的.这个算法的基本思路就是通过一系列名为& ...

  8. 使用Xcode和Instruments调试解决iOS内存泄露(转)

    转自:http://blog.csdn.net/totogo2010/article/details/8233565 虽然iOS 5.0版本之后加入了ARC机制,由于相互引用关系比较复杂时,内存泄露还 ...

  9. 使用Xcode和Instruments调试解决iOS内存泄露【转】

    转载自:http://blog.csdn.net/totogo2010/article/details/8233565 虽然iOS 5.0版本之后加入了ARC机制,由于相互引用关系比较复杂时,内存泄露 ...

  10. python 单例模式内存泄露_彻底搞懂Java内存泄露

    之前一直在简书写作,第一次发布到SF上来,也是第一次使用SF,后面会尽量同步到SF,更多文章请关注: 简书 编程之乐 转载请注明出处:谢谢! Java内存回收方式 Java判断对象是否可以回收使用的而 ...

最新文章

  1. springMVC静态资源访问不到
  2. 虚幻4 控制台_鹅厂新手机游戏开测,虚幻4引擎开发战略游戏,能否超过率土之滨...
  3. mysql链表_MySql链表语句--博客园老牛大讲堂
  4. apache站点优化——长连接
  5. 2019.02.09 bzoj4455: [Zjoi2016]小星星(容斥原理+dp)
  6. Tridiv:基于 Web 的 CSS 编辑器,创建炫丽 3D 图形
  7. Azure 5月新发布:CDN图片处理功能, CDN Restful API, 新版CDN管理门户, 计量名称变更延期
  8. django中怎样新建html页面,Django网站创建从html页面到另一个应用程序的主html页面的链接...
  9. 试简述smtp通信的三个阶段的过程_对通信技术来说,物联网起了什么样的作用?...
  10. java+MySQL基于ssm的公文流转关管理系统
  11. Python3脚本抢票
  12. 零基础搭建Win系统Anaconda+Pytorch+OpenCV深度学习环境(Win10、Win11、RTX 3090显卡也适用)
  13. 四、【入门篇】官方LIB库、位带操作
  14. 微信关键字自动回复功能实现
  15. 个人隐私保护条例_个人信息保护及隐私政策
  16. 提高抗打击能力_如何提高心理承受能力或者抗打击能力?
  17. 2022出海拉美:秘鲁电商市场现状及发展前景
  18. python开发语音录入_基于python实现语音录入识别代码实例
  19. HuggingFace简明教程
  20. tibco EMS 8.2.0安装

热门文章

  1. Operations-ansible-01
  2. adb devices offline_android adb devices offline的解决办法
  3. 灰色模型python_python(pygame和pyopenGL)转换3D模型(。obj文件)变成一个灰色图像序列...
  4. LIME-AI可解释模型:《“Why Should I Trust You?” Explaining the Predictions of Any Classifier》论文笔记
  5. 阿里云开发者大会观后感
  6. EDGEX FOUNDRY配置参数 --- sys-mgmt-agent
  7. 百度竞价的五个基本特征!
  8. 教你添加百度分享按钮
  9. java识别音高_如何找出音乐的音高
  10. Postgresql下载地址及安装教程