如果我只想在Netty应用程序中使用ByteBuf。我使用ByteBuf buf = Unpooled.wrappedBuffer(bytes)
创建一个ByteBuf,我必须在函数末尾调用buf.release
吗?
public void process(byte[] bytes) {
ByteBuf frame = Unpooled.wrappedBuffer(bytes);
//something
frame.release();
}
答案 0 :(得分:1)
UnpooledHeapByteBuf.release
方法实现如下:
@Override
public boolean release() {
for (;;) {
int refCnt = this.refCnt;
if (refCnt == 0) {
throw new IllegalReferenceCountException(0, -1);
}
if (refCntUpdater.compareAndSet(this, refCnt, refCnt - 1)) {
if (refCnt == 1) {
deallocate();
return true;
}
return false;
}
}
}
deallocate
方法:
@Override
protected void deallocate() {
array = null;
}
堆内存可以通过垃圾收集器进行回收,因此在我看来,不要在理论上调用release
方法可能不会造成内存泄漏。
答案 1 :(得分:1)
根据经验,一旦完成使用ByteBuf.release()
,您应该始终致电ByteBuf
。这将允许您在以后切换到直接缓冲区或池化缓冲区而无需更改任何代码。