1.问题描述

使用netty做底层的tcp数据收发的项目时候,当对象上升到一定的时候(我这里是每秒1400的tcp包)会偶尔出现:LEAK: ByteBuf.release() was not called before it’s garbage-collected. See https://netty.io/wiki/reference-counted-objects.html for more information.Recent access records:

2.问题分析

我们是在数量多了以后遇到了这个问题,而且并不是平凡的触发这个东西。

同样书数量级我们先发开jvm 的GC日志看看

在idea的jvm启动项里面配置

-XX:+PrintGCDetails -XX:+PrintGCDateStamps

开启jvm的gc日志

我们看看是否是因为GC是主要的诱因。

业务逻辑是定时任务发送请求然后,然后得到modbusTCP的响应,通过2进制的数据对设备信息进行解析。也就是说一个modbusTCP响应是在22~24位的16进制数。现在是测试1000台循行情况看是否能处理过来。


我们发现并不是每一次GC都出现ByteBuf这里的这个错误。

也就是说GC并不是触发这个错误的核心的问题。但是在错误的信息里面确实提到了垃圾回收。

所以我们可以做一个假设,按照错误的描述内容,byteBuff在执行release方法之前就被垃圾回收了,这个回收的byteBuff,也就是byteBuff意外关闭了。即这部分你的内存泄漏了。

3.问题解决

通过查找,jvm对于这部分的可以通过添加运行参数,在netty添加相关的处理器

ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.ADVANCED);

加载netty配置的位置

  serverBootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)// option()和handler()都是给bossGroup设置的;握手字符串长度.option(ChannelOption.SO_BACKLOG, 1024).option(ChannelOption.TCP_NODELAY, true).handler(new LoggingHandler(LogLevel.INFO)).childHandler(workReceivedChannelInitialize);Log.get().info("初始化完毕");//  加在这里ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.ADVANCED);channelFuture = serverBootstrap.bind(inetSocketAddress).sync();

打印的日志出现了位置信息

4.解决

既然知道了内存泄漏的位置,只要在使用完手动释放即可

对于byteBuff只要调用其release方法就可以了

info.readBytes(message);
String data = ByteArrayToString.byteArrayToHexString(message);// 读完就释放
info.release();

netty使用中的LEAK: ByteBuf.release() was not called before it‘s garbage-collected相关推荐

  1. Netty 系列三(ByteBuf).

    一.概述和原理 网络数据传输的基本单位总是字节,Netty 提供了 ByteBuf 作为它的字节容器,既解决了 JDK API 的局限性,又为网络应用程序提供了更好的 API,ByteBuf 的优点: ...

  2. netty源码之ByteBuf详解

    一.背景简介 ByteBuf,顾名思义,就是字节缓冲区,是Netty中非常重要的一个组件.熟悉jdk NIO的同学应该知道ByteBuffer,正是因为jdk原生ByteBuffer使用比较复杂,某些 ...

  3. 《netty实战》阅读笔记(2)——Netty 的数据容器ByteBuf

    ByteBuffer 当我们进行数据传输的时候,往往需要使用到缓冲区,常用的缓冲区就是JDK NIO类库提供的java.nio.Buffer. 实际上,7种基础类型(Boolean除外)都有自己的缓冲 ...

  4. vld for memory leak detector (release version)

    有没有这样的情况,无法静态的通过启动和退出来查找内存泄露,比如网络游戏,你总不能直接关游戏那玩家怎么办? 现在vld支持release,我们可以动态的找. 1.在release版本使用vld了.< ...

  5. 【Netty4】netty ByteBuf (二) 引用计数对象(reference counted objects)

    原文出处:http://netty.io/wiki/reference-counted-objects.html 相关文章: netty ByteBuf (一)如何创建ByteBuf对象 netty ...

  6. 【Netty官方文档翻译】引用计数对象(reference counted objects)

    原文出处:http://netty.io/wiki/reference-counted-objects.html 原文地址可能有变,且内容可能发生变化. 如果转载请注明出处,谢谢合作^_^. 自从Ne ...

  7. 记录一次OOM排查经历

    我是用了netty搭建了一个UDP接收日志,堆启动配置 Xmx256  Xms256 ,项目刚启动的时候,系统进程占用内存很正常,在250M左右. 长时间运行之后发现,进程占用内存不断增长,远远超过了 ...

  8. Reference counted Objects (引用计数对象) - 文章翻译

    原文地址:http://netty.io/wiki/reference-counted-objects.html 从Netty4开始,某些对象的饿生命周期由其引用计数来管理,因此,一旦不再使用,Net ...

  9. 当Tomcat遇上Netty,我这一系列神操作,同事看了拍手叫绝

    故事背景 嘀~嘀~嘀~,生产事故,内存泄漏! 昨天下午,突然收到运维的消息,分部某系统生产环境内存泄漏了,帮忙排查一下. 排查过程如下: 第一步,要日志 分部给到的异常日志大概是这样(鉴于公司规定禁止 ...

  10. 关于Netty的ByteBuff内存泄漏问题

    之前做的东华车管数据采集平台总是发生数据丢失的情况,虽然不频繁但是还是要关注一下原因,于是今天提高了Netty的Log级别,打算查找一下问题出在哪了,提高级别代码: ServerBootstrap b ...

最新文章

  1. ElasticSearch+ElasticGeo+Geoserver发布ES地理数据
  2. Spring框架中的设计模式(二)
  3. mysql的in查询参数限制,多少数据量会造成性能下降?什么时候创建临时表合适?
  4. 关于复选框选中状态的判断
  5. 大数据反欺诈技术架构
  6. 14-多对多关系建表
  7. typescript_清洁架构的TypeScript刺
  8. 上海交大研究生计算机考研真题,2011年上海交通大学计算机研究生机试真题
  9. SQL Server存储过程作业(二)
  10. 深入支付宝支付扫描支付-跳转支付宝二维码页面支付与自定义生成二维码支付-2跳转固定的支付宝页面进行扫码支付
  11. 【2021年度总结】旧年的喜怒哀乐和新年的虎啸龙腾
  12. 微信缓存dat怎么转图片_PC微信dat怎么转图片?
  13. 加密就像玩魔方----图文详解对称加密(DES、AES)
  14. Cocos2D-HTML5开源2D游戏引擎
  15. 搜索局域网内电脑共享文件的方法
  16. java连接redis存取数据(详细)
  17. 科目二需要注意的点(笔记包含图片讲解)
  18. Android X86更改屏幕分辨率
  19. 【如何开发小程序】自己如何开发小程序?
  20. 大数据对人们的好处_大数据给人们生活带来哪些好处?

热门文章

  1. 用html制作空心菱形的代码,javascript打印完整金字塔型_完整菱形_空心菱形_思路算法详解_js源代码...
  2. WorldPress出现Briefly unavailable for scheduled maintenance. Check back in a minute.的解决方法
  3. 练习:用swiper实现图片滑动
  4. VS2010/MFC编程入门教程之目录和总结(鸡啄米)
  5. Adobe Premiere常用快捷键_艾孜尔江摘录
  6. PHP的strtolower()和strtoupper()函数在安装非中文系统的服务器下可能会导致将汉字转换为乱码,请写两个替代的函数实现兼容Unicode文字的字符串大小写转换
  7. python调用若快打码接口
  8. oracle otm运输管理系统_OTM服务中国十年-Oracle.PDF
  9. 汉诺塔游戏(Python)
  10. nmap命令man详解与脚本目录