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

本文介绍了Netty4中引入的引用计数对象管理机制,以提高ByteBuf等对象的分配和回收效率。引用计数提供了一种替代垃圾收集的实时释放策略,但也可能导致引用泄漏。详细讲解了如何正确使用retain()、release(),以及在ByteBuf派生、ByteBufHolder接口、ChannelHandler中处理引用计数。同时,提到了Netty的泄漏检测机制和最佳实践,以防止内存泄漏。
摘要由CSDN通过智能技术生成

原文地址:http://netty.io/wiki/reference-counted-objects.html

从Netty4开始,某些对象的饿生命周期由其引用计数来管理,因此,一旦不再使用,Netty就可以将它们(或其共享资源)返回给对象池(或对象分配器)。垃圾收集和引用队列并没有提供不可达的高效实时保证,而引用计数则提供了一种可替代的机制,代价是有轻微的不方便。

ByteBuf是最值得注意的一种,它利用了引用计数来提高分配和回收的性能,本节将解释哈在Netty中使用ByteBuf的引用计数。

-引用计数的基础
新引用计数对象的引用计数为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;

–Dangling引用
尝试访问引用计数为0的引用计数对象将触发IllegalReferenceCountException.

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

–增加引用计数
引用计数也可以通过retain()操作来增加在其尚未被销毁之前。

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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值