【Netty】Netty为什么要手动释放ByteBuf资源?
ByteBuf是Netty网络通信框架中一个重要的组件。先进和友好的设计理念让开发者受益匪浅。
- 两个指针操作ByteBuf -> 读和写
- 对象池技术 -> 非垃圾回收机制
对象池技术
- 对象池模式是一种软件创建设计模式,它使用一组可重用的对象 - “池” ,而不是按需分配和销毁它们。池的客户端从池中请求对象并对返回的对象执行操作。当客户端完成后,它将对象返回到池而不是销毁它,这可以手动或自动完成。
- 在某些情况下,对象池可显着提高性能。对象池使对象生存期复杂化,因为此时实际上并未创建或销毁从池中获取和返回到池的对象,因此需要小心实现。
- 常用在实例化开销大的对象。
Netty利用ByteBuf对象池
- Netty在对象池中利用引用计数器技术,为创建的ByteBuf对象设置引用计数器。
- 仅当引用计数器的值为0时,返回对象池回收。
- 新创建的引用计数对象的计数器的初始值为1:
ByteBuf buf = ctx.alloc().directBuffer();
assert buf.refCnt() == 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;
- 尝试访问引用计数器的值为0的引用计数对象将触发
IllegalReferenceCountException
异常:
assert buf.refCnt() == 0;
try {buf.writeLong(0xdeadbeef);throw new Error("should not reach here");
} catch (IllegalReferenceCountExeception e) {// Expected
}
谁来销毁引用计数对象
一般的经验法则是,最后访问引用计数对象的一方负责销毁引用计数对象。 进一步来说:
- 如果[发送]组件应该将引用计数对象传递给另一个[接收]组件,则发送组件通常不需要销毁它,而是将该决定推迟到接收组件。
- 如果组件使用引用计数对象并且知道其他任何内容都不再访问它(即,不传递给另一个组件引用),则组件应该销毁它。
为什么Netty会发生内存泄漏问题
如果应用程序在使用ByteBuf后,没有调用方法release()
(这个方法将其放回对象池中),又没有任何进一步的引用,则会发生泄漏。 在这种情况下,缓冲区(ByteBuf)最终将被GC(垃圾回收器)清除,但Netty的对象池不会知道这种情况。 然后,对象池将逐渐相信程序正在使用越来越多的永不返回池中的ByteBuf。这可能会产生内存泄漏。这可能会产生内存泄漏,因为ByteBuf被垃圾回收器回收,对象池回收不到它。导致对象池创建越来越多的新的引用计数对象。
【Netty】Netty为什么要手动释放ByteBuf资源?相关推荐
- Java手动释放内存
托管的资源不需要开发者理会,垃圾回收器会自动回收,而非托管资源则需要开发者手动回收. 为什么呢,因为有些资源如数据库连接,io等等不仅仅包含对象所占内存,还包含一些物理资源(具体什么叫物理资源,还请知 ...
- 手动查看和删除IPC未释放的资源
1,举一个造成IPC资源未释放的例子: eg:使用共享队列,在程序未主动释放共享队列资源的时候,ctrl+c: 导致申请的共享队列资源未被操作系统回收. 2,查看系统中没被释放的IPC资源 ipcs ...
- linux手动释放内存的方法
Linux手动释放缓存的方法 Linux释放内存的命令: sync echo 1 > /proc/sys/vm/drop_caches drop_caches的值可以是0-3之间的数字,代表不同 ...
- 如何手动释放Linux内存的方法
当在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching.这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法.那么我来谈谈这个问题 ...
- JNI内存方面说明以及相关类型手动释放内存
JNI内存方面说明以及相关类型手动释放内存 一.Java内存 二.JNI内存和引用 三.Local Reference 四.Global Reference 五.Weak Global Referen ...
- 清理linux服务器缓存,详解Linux手动释放缓存的方法
详解Linux手动释放缓存的方法 发布时间:2020-08-20 07:53:27 来源:脚本之家 阅读:87 作者:闪电王国 栏目:服务器 Linux释放内存的命令: sync echo 1 > ...
- linux内存cached手动释放
总有很多朋友对于Linux的内存管理有疑问,之前一篇linux下的内存管理方式似乎也没能清除大家的疑虑.而在新版核心中,似乎对这个问题提供了新的解决方法,特转出来给大家参考一下.最后,还附上我对这方法 ...
- linux 手动释放内存
当在Linux下 频繁存取文件 或者 程序测试频繁崩溃后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching 因此我们很有必要手动清理系统缓存释放内存. 我们在清理缓存 ...
- Linux内存(手动释放cache)
项目的扩容申请了一台机器,到手之后看一下机器的指标,看到内存使用情况是这样的. 1.查看内存 free $ free -htotal used free shared buffers cached M ...
最新文章
- 再测Golang的JSON库
- 配置hadoop集群,完全分布式模式
- springMVC转发与重定向
- 最优化课堂笔记08——非线性规划中的一些其他方法(考试你懂得)
- 实战HMM-Viterbi角色标注地名识别
- JAVA框架--hibernate、struts2、spring
- Java交替打印两个字符串
- 784. 字母大小写全排列
- 7-7自动色阶/自动对比度/自动颜色
- Centos中yum方式安装java
- html搜索联系人,联系人列表.html
- 百度地图api之路线规划
- 游戏编辑器制作(7)
- 七牛云融合CDN到底怎么配置?
- mysql启动报错ERROR 2003 (HY000) Can‘t connect to MySQL server on ‘localhost3306‘ (10061)解决办法
- 学习笔记9--深度前馈网络
- mt4登录下方显示没有服务器,FXCM福汇MT4登录没有FXCM-USDReal07服务器怎么办,登录不了...
- Internet Explorer 各版本文件上传和下载限制
- 服务器压力测试工具0——需求与设计
- 商标干货!所有企业都值得收藏!
热门文章
- 微生物生态期刊Soil Biology and Biochemistry(SBB)简介
- 疯狂的消化之旅|消化系统简介
- Python使用matplotlib可视化面积图(Area Chart)、通过给坐标轴和曲线之间的区域着色可视化面积图、在面积图的指定区域添加箭头和数值标签
- R语言使用ggplot2包使用geom_violin函数绘制分组小提琴图(配置显示散点、抖动点jitter)实战
- R语言构建仿真列联表并进行卡方检验(chisq.test):检验两个分类变量是否独立、输出期望的列联表
- python使用fpdf2包和pdfrw包在已有的PDF页面上添加新的页
- python使用imbalanced-learn的SMOTETomek方法同时进行上采样和下采样处理数据不平衡问题
- R构建岭回归模型(Ridge Regression)实战
- R可视化包ggplot2修改可视化图像的字体大小
- python代码实现插入排序