ByteBuf是Netty网络通信框架中一个重要的组件。先进和友好的设计理念让开发者受益匪浅。

  1. 两个指针操作ByteBuf -> 读和写
  2. 对象池技术 -> 非垃圾回收机制

对象池技术

  1. 对象池模式是一种软件创建设计模式,它使用一组可重用的对象 - “池” ,而不是按需分配和销毁它们。池的客户端从池中请求对象并对返回的对象执行操作。当客户端完成后,它将对象返回到池而不是销毁它,这可以手动或自动完成。
  2. 在某些情况下,对象池可显着提高性能。对象池使对象生存期复杂化,因为此时实际上并未创建或销毁从池中获取和返回到池的对象,因此需要小心实现。
  3. 常用在实例化开销大的对象。

Netty利用ByteBuf对象池

  1. Netty在对象池中利用引用计数器技术,为创建的ByteBuf对象设置引用计数器。
  2. 仅当引用计数器的值为0时,返回对象池回收。
  3. 新创建的引用计数对象的计数器的初始值为1:
ByteBuf buf = ctx.alloc().directBuffer();
assert buf.refCnt() == 1;
  1. 释放引用计数对象时,其引用计数器的值减1。如果引用计数到达0,则引用计数对象将被释放或返回其对象池:
assert buf.refCnt() == 1;
// release() returns true only if the reference count becomes 0.
boolean destroyed = buf.release();
assert destroyed;
assert buf.refCnt() == 0;
  1. 尝试访问引用计数器的值为0的引用计数对象将触发IllegalReferenceCountException异常:
assert buf.refCnt() == 0;
try {buf.writeLong(0xdeadbeef);throw new Error("should not reach here");
} catch (IllegalReferenceCountExeception e) {// Expected
}
  1. 谁来销毁引用计数对象

    一般的经验法则是,最后访问引用计数对象的一方负责销毁引用计数对象。 进一步来说:

  • 如果[发送]组件应该将引用计数对象传递给另一个[接收]组件,则发送组件通常不需要销毁它,而是将该决定推迟到接收组件。
  • 如果组件使用引用计数对象并且知道其他任何内容都不再访问它(即,不传递给另一个组件引用),则组件应该销毁它。

为什么Netty会发生内存泄漏问题

如果应用程序在使用ByteBuf后,没有调用方法release()(这个方法将其放回对象池中),又没有任何进一步的引用,则会发生泄漏。 在这种情况下,缓冲区(ByteBuf)最终将被GC(垃圾回收器)清除,但Netty的对象池不会知道这种情况。 然后,对象池将逐渐相信程序正在使用越来越多的永不返回池中的ByteBuf。这可能会产生内存泄漏。这可能会产生内存泄漏,因为ByteBuf被垃圾回收器回收,对象池回收不到它。导致对象池创建越来越多的新的引用计数对象。

【Netty】Netty为什么要手动释放ByteBuf资源?相关推荐

  1. Java手动释放内存

    托管的资源不需要开发者理会,垃圾回收器会自动回收,而非托管资源则需要开发者手动回收. 为什么呢,因为有些资源如数据库连接,io等等不仅仅包含对象所占内存,还包含一些物理资源(具体什么叫物理资源,还请知 ...

  2. 手动查看和删除IPC未释放的资源

    1,举一个造成IPC资源未释放的例子: eg:使用共享队列,在程序未主动释放共享队列资源的时候,ctrl+c: 导致申请的共享队列资源未被操作系统回收. 2,查看系统中没被释放的IPC资源 ipcs ...

  3. linux手动释放内存的方法

    Linux手动释放缓存的方法 Linux释放内存的命令: sync echo 1 > /proc/sys/vm/drop_caches drop_caches的值可以是0-3之间的数字,代表不同 ...

  4. 如何手动释放Linux内存的方法

    当在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching.这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法.那么我来谈谈这个问题 ...

  5. JNI内存方面说明以及相关类型手动释放内存

    JNI内存方面说明以及相关类型手动释放内存 一.Java内存 二.JNI内存和引用 三.Local Reference 四.Global Reference 五.Weak Global Referen ...

  6. 清理linux服务器缓存,详解Linux手动释放缓存的方法

    详解Linux手动释放缓存的方法 发布时间:2020-08-20 07:53:27 来源:脚本之家 阅读:87 作者:闪电王国 栏目:服务器 Linux释放内存的命令: sync echo 1 > ...

  7. linux内存cached手动释放

    总有很多朋友对于Linux的内存管理有疑问,之前一篇linux下的内存管理方式似乎也没能清除大家的疑虑.而在新版核心中,似乎对这个问题提供了新的解决方法,特转出来给大家参考一下.最后,还附上我对这方法 ...

  8. linux 手动释放内存

    当在Linux下 频繁存取文件 或者 程序测试频繁崩溃后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching 因此我们很有必要手动清理系统缓存释放内存. 我们在清理缓存 ...

  9. Linux内存(手动释放cache)

    项目的扩容申请了一台机器,到手之后看一下机器的指标,看到内存使用情况是这样的. 1.查看内存 free $ free -htotal used free shared buffers cached M ...

最新文章

  1. 再测Golang的JSON库
  2. 配置hadoop集群,完全分布式模式
  3. springMVC转发与重定向
  4. 最优化课堂笔记08——非线性规划中的一些其他方法(考试你懂得)
  5. 实战HMM-Viterbi角色标注地名识别
  6. JAVA框架--hibernate、struts2、spring
  7. Java交替打印两个字符串
  8. 784. 字母大小写全排列
  9. 7-7自动色阶/自动对比度/自动颜色
  10. Centos中yum方式安装java
  11. html搜索联系人,联系人列表.html
  12. 百度地图api之路线规划
  13. 游戏编辑器制作(7)
  14. 七牛云融合CDN到底怎么配置?
  15. mysql启动报错ERROR 2003 (HY000) Can‘t connect to MySQL server on ‘localhost3306‘ (10061)解决办法
  16. 学习笔记9--深度前馈网络
  17. mt4登录下方显示没有服务器,FXCM福汇MT4登录没有FXCM-USDReal07服务器怎么办,登录不了...
  18. Internet Explorer 各版本文件上传和下载限制
  19. 服务器压力测试工具0——需求与设计
  20. 商标干货!所有企业都值得收藏!

热门文章

  1. 微生物生态期刊Soil Biology and Biochemistry(SBB)简介
  2. 疯狂的消化之旅|消化系统简介
  3. Python使用matplotlib可视化面积图(Area Chart)、通过给坐标轴和曲线之间的区域着色可视化面积图、在面积图的指定区域添加箭头和数值标签
  4. R语言使用ggplot2包使用geom_violin函数绘制分组小提琴图(配置显示散点、抖动点jitter)实战
  5. R语言构建仿真列联表并进行卡方检验(chisq.test):检验两个分类变量是否独立、输出期望的列联表
  6. python使用fpdf2包和pdfrw包在已有的PDF页面上添加新的页
  7. python使用imbalanced-learn的SMOTETomek方法同时进行上采样和下采样处理数据不平衡问题
  8. R构建岭回归模型(Ridge Regression)实战
  9. R可视化包ggplot2修改可视化图像的字体大小
  10. python代码实现插入排序