Netty小记——引用计数机制

Netty源码分析之ByteBuf引用计数 前言 引用计数是一种常用的内存管理机制,是指将资源的被引用次数保存起来,当被引用次数变为零时就将其释放的过程。Netty在4.x版本开始使用引用计数机制进行部分对象的管理,其实现思路并不是特别复杂,它主要涉及跟踪某个对象被引用的次数。在Netty具体代码中需要通过引用计数进行内存管理的对象,会基于ReferenceCounted接口实现,其中引用计数大于0时则代表该对象被引用不会释放,当引用计数减少到0时,该对象就会被释放。通过引用计数机制,Netty可以很好的实现内存管理,引用计数减少到0时要么直接释放 阅读详情

引用计数机制在很多框架中都有使用,如果在游戏引擎框架coscos2dx中,这种机制可以很简单的进行对象的生命周期的管理,netty引用计数机制原文:http://netty.io/wiki/reference-counted-objects.html

Since Netty version 4, the life cycle of certain objects are managed by their reference counts, so that Netty can return them (or their shared resources) to an object pool (or an object allocator) as soon as it is not used anymore. Garbage collection and reference queues do not provide such efficient real-time guarantee of unreachability while reference-counting provides an alternative mechanism at the cost of slight inconvenience.

从netty的4.x版本开始,netty使用引用计数机制进行部分对象的管理,通过该机制netty可以很好的实现自己的共享资源池。如果应用需要一个资源,可以从netty自己的共享资源池中获取,新获取的资源对象的引用计数被初始化为1,可以通过资源对象的retain方法增加引用计数,当引用计数为0的时候该资源对象拥有的资源将会被回收。
这种方式相比于jvm的垃圾回收机制和引用队列机制来说更加实时高效,但是牺牲了一部分易用性。

资源初始化的时候引用计数为1

ByteBuf buf = ctx.alloc().directBuffer();
assert buf.refCnt() == 1;

当需要释放资源的时候,调用release函数会将引用计数减一(release仅仅是减少引用计数,当引用计数为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的时候,如果应用程序继续使用那么会抛出IllegalReferenceCountExeception异常

assert buf.refCnt() == 0;
try {
  buf.writeLong(0xdeadbeef);
  throw new Error("should not reach here");
} catch (IllegalReferenceCountExeception e) {
  // Expected
}

如果资源对象需要在多个逻辑中使用,可以通过retain来增加引用计数,从而可以避免引用计数为0时引起的异常引用的异常

ByteBuf buf = ctx.alloc().directBuffer();
assert buf.refCnt() == 1;

buf.retain();
assert buf.refCnt() == 2;

boolean destroyed = buf.release();
assert !destroyed;
assert buf.refCnt() == 1;

谁负责释放资源,最后使用资源的负责释放资源,具体查看原文例子

如果netty自带的部分decode类返回的对象是引用计数的,那么只需要使用者在最后一个处理该自定义的handler中调用release方法即可(但是一定要调用,否则会造成内存泄漏)

同样的在outbound handler中,如果应用层使用了带引用计数的对象,那么在outbound的pipeline的最后一个使用该对象的handler应该负责reease该对象,否则会出现内存泄漏

The disadvantage of reference counting is that it is easy to leak the reference-counted objects. Because JVM is not aware of the reference counting Netty implements, it will automatically GC them once they become unreachable even if their reference counts are not zero. An object once garbage collected cannot be resurrected, and thus cannot be returned to the pool it came from and thus will produce memory leak.
内存泄漏:在netty中的内存泄漏是指GC自动回收了refCnt>0的对象的内存,这种情况下使得该对象无法被重建,同时也无法被归还回到netty自己的缓冲区中,所以即使该内存被jvm GC可用了,但是应用层仍然标志了该内存被使用中,从而使得该块内存在应用的整个生命周期中无法被使用,造成了浪费。

2024.6.10丨基于DIAMOND与VFDB数据库的致病菌毒力因子高效注释指南 本文详细介绍了基于DIAMOND与VFDB数据库的致病菌毒力因子高效注释方法,涵盖工具安装、参数优化、数据库选择及实战案例解析。通过DIAMOND的快速比对和VFDB的全面毒力因子数据,显著提升微生物基因组研究效率,适用于临床检测、食品安全监测等多个场景。 阅读详情

相关推荐

ESP8266 进行HDLC解码,AX.25,APRS

/************************************************************** 函数名:aprs_wait_begin() 参 数:无 返回值:bool true=得到合法脉冲,false=未得到 说 明:等待第1个833us高脉冲,判断范围 730-930,其他忽略 ***************************************************************/ bool aprs_wait_begin(){ stati

蓝蓝的博客 1630

netty的对象的生命周期管理——引用计数

一、何谓引用计数 二、引用计数的应用 三、引用计数的局限 四、netty的引用计数的实现 五、netty的内存泄露检查 六、netty的引用计数的使用举例

heishiyuriyao的专栏 2596

在Jetson Orin (Arm64)上从Ubuntu22.04回退至20.04的完整指南及ROS-noetic适配方案

本文提供了在Jetson Orin (Arm64)设备上将Ubuntu 22.04系统回退至20.04 LTS版本的完整操作指南。针对机器人开发中ROS-noetic对Ubuntu20.04的官方最佳支持,详细阐述了从关键备份、软件源与APT优先级配置、系统降级执行到后续问题排查的全过程,并附带了在Arm64架构上成功安装和验证ROS-noetic的适配方案,旨在为开发者构建稳定可靠的机器人开发环境。

flower的专栏 580

Netty之引用计数

Netty中实现引用计数的接口是ReferenceCounted,一个实现了ReferenceCounted接口的类就具备了引用计数的能力。 当一个引用计数的对象被初始化时, 引用计数器被初始化为1。 ReferenceCounted接口中两个主要的方法: retain()方法对引用计数加1,release()方法对引用计数减1。如果引用计数被减到0...

猎户星座 1237

YOLO26改进策略【Head】| (独家改进)轻量化检测头:利用 EfficientNet 中的移动倒置瓶颈模块 MBConv 改进检测头

本文记录的是基于移动倒置瓶颈 MBConv 的 YOLO26 的检测头轻量化改进方法研究。采用了独特的倒置瓶颈结构,通过的操作以及,在高效提取特征的同时极大地降低了计算量。本文将的设计优势融入j检测头中,使其在目标检测任务中不仅能够更精准地识别各类目标,还能在计算资源有限的情况下快速响应,展现出更为卓越的实时检测能力。EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks的实现代码如下: 首先在代码中加入如下代码: 其

Limiiiing的博客 286

如何设置反馈点

前面的POWER DC仿真都是忽略反馈线进行的仿真,如果单板压降不过,电源会自动调整输出电压,来满足负载的得到额定的电压.可以看到因为设置了反馈点,源端电压就被抬高到满足压降的值了。仿真上也可以自己添加反馈点,以得到抬高后的电源输出电压值。同样以下图的CPU的Core电源为例。按照流程正常设置好参数。

weixin_54787054的博客 1148

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

原文出处:http://netty.io/wiki/reference-counted-objects.html 原文地址可能有变,且内容可能发生变化。 如果转载请注明出处,谢谢合作^_^。   自从Netty 4开始,对象的生命周期由它们的引用计数(reference counts)管理,而不是由垃圾收集器(garbage collector)管理了。ByteBuf是最值得注意的,它...

xcc的博客 978

数字IC/FPGA 秋招知识点不全面整理

数字IC/FPGA 秋招知识点不全面整理

w0shishabi的博客 7866

Netty中ByteBuf的引用计数实现原理

在Netty中,需要通过引用计数进行内存管理的对象会基于ReferenceCounted接口实现。ByteBuf继承了这个接口,因此每个ByteBuf对象都有一个引用计数。当这个数值为0时,ByteBuf对象的方法便无法再使用,对象占用的内存资源将被释放。

码到三十五 1128

【tessy】软件环境配置:Keil C51 Keil uVision UVSC (Default)

本文详细说明了tessy软件如何配置【Keil C51 Keil uVision UVSC (Default)】环境,具体操作步骤和注意事项

qq_37282365的博客 600

【城市数据集】世界城市数据库和访问门户工具WUDAPT

简介世界城市数据库和访问门户工具WUDAPT

WW、forever的博客 1286

基于netty的web socket小记

1、WebSocketProtocolHandler里面包含了handshake过程,并且会在handshake完成之后产生一个用户事件往后面的管道传递,可以通过该事件判断web socket是否建立成功。ping、pong心跳帧已经在该handler中处理,管道后面的handler可以不用处理。 2、在web socket服务器开发的时候,会用到http codec相关的handler,这些h

m47838704的专栏 620

手把手教你搭建工业级C#上位机:完整架构+通信+配置+日志,新手也能落地(附全套源码)

模型层是“数据容器”,统一数据格式,避免参数传递混乱。本文搭建的C#上位机,采用“分层+模块化”架构,解耦了UI、通信、配置、日志四大核心功能,不仅满足工业场景的基础需求,还为后续扩展打下基础。新手跟着步骤走,既能掌握上位机的核心开发技能,又能理解工业级项目的架构设计思路。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1155

Netty(五)—服务端小记

Netty服务端 Netty客户端程序员启动需要使用 Bootstrap 对象 和客户端不同,服务端使用 ServerBootStrap 对象来启动 Server代码实现 通过和客户端代码实现对比,可以发现 服务端设置了两个EventLoopGroup对象,分别用于处理客户端连接请求和处理IO操作 与客户端实现不同 服务端使用 ServerBootstrap 来实现程序启动 使用 ServerBootstrap 的 bind 方法来启动服务 public void start(int port

记录成长的过程 377

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Netty学习小记

Netty提供了方便快速的API用于搭建网络, 一下是我学习Netty后的一些小笔记 Netty的线程模型 Netty使用React线程模型 具体Netty服务端的初始化如下 public final class SecureChatServer { static final int PORT = Integer.parseInt(System.getProperty("p

485

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Netty小记——web socket分片聚合实现

在netty中已经对web socket的分片重组进行了相应的实现,具体的实现类是 WebSocketFrameAggregator,该类继承自netty的消息聚合器MessageAggregator。 MessageAggregator ...... * @param the type that covers both start message and content messag

m47838704的专栏 1739

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

源起Netty

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34417200的博客 156

回调模式小记

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33979203的博客 93

Ali面试小记

1. volatile关键字的应用场景? 为啥要用volatile2. gc你知道的一切。3.JDK1.7后续的concurrent包。4.HashMap内部实现。5.内存溢出/泄露的几种常见方式?6.消息传递队列和分布式组件?7.死锁的例子。如何确保不发生死锁?有哪些方法?给出代码例子。8.HashMap设计key需要考虑哪些因素?9.zookeeper的内部实现。(妹的paxos我到现在都没看...

cloudeagle_bupt的专栏 471

dubbo常见面试题,小记(一)

dubbo 是主流的RPC服务端框架,可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。还有注册中心、协议支持、服务监控、等内容。 常见dubbo面试题 1、dubbo默认使用的是什么通信框架,还有什么? 默认使用netty框架,还有mina。 2、dubbo服务调用是阻塞的吗? 默认是阻塞的,可以异步调用,没有返回值的可以这么做。 3、一般使用什么注册...

编程者说的博客专栏 582

学习小记 -- Dubbo服务调用过程

服务端流程: Netty收到请求,根据协议得到信息并且反序列化成对象。 按照派发策略派发消息,默认是 All,封装成一个ChannleEventRunnable扔给业务线程池。 业务线程会根据消息类型,调用不同的处理类。 通过请求的id构造出一个响应。 通过一系列参数构造得到 serviceKey ,从之前服务暴露生成的 exporterMap 中得到对应的 Invoker ,然后调用真实的实现类。 返回响应。 客户端流程; 调用接口方法,实际上调用的是代理类。 通过路由和负载均衡得到in.

weixin_42029860的博客 361

面试小结 - 消息队列

记录一下秋招面试遇到关于 消息队列 的问题,会持续更新。

放荡者的茶会 1954

从零实现RS485与RS232通信方式对比实验

通过实际搭建通信环境,深入剖析rs485和rs232区别总结,涵盖电气特性、传输距离与抗干扰能力,帮助开发者理解两种串行通信标准在真实场景中的表现差异。

weixin_42629522的博客 761

java学习资源整理

java学习之乱七八糟的整理这里罗列一些我学习过程中看到的网站,分享给大家;声明这些不是本人的原创,只是拿来学习使用!如果给您造成不便,深表歉意,联系本人予以删除!

云端做梦 442

美团Java面试被问:Netty的ByteBuf引用计数和内存释放

本文详细介绍了Netty的引用计数内存管理机制及其实现原理。主要内容包括:1)引用计数核心原理,通过ReferenceCounted接口和AbstractReferenceCountedByteBuf实现线程安全的计数管理;2)内存管理实现,涵盖堆内存、直接内存和池化内存三种ByteBuf的具体实现;3)内存泄漏检测机制,包括ResourceLeakDetector的实现原理和预防最佳实践;4)高级内存管理策略,如内存池优化配置、零拷贝技术和智能分配策略;5)生产环境最佳实践,提供配置示例、验证器和监控服务

2501_94505843的博客 856

Netty:ByteBuf的引用计数

Netty:ByteBuf的引用计数

听海边涛声 580
上一篇: Hashmap的高性能使用小记
下一篇: netty源码注解——websocket握手和分片组合
m47838704
博客等级 码龄16年 91粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值