Netty 下游处理程序缓冲区管理

问题描述 投票:0回答:1

有一个关于 Netty 下游缓冲区发送流的缓冲区管理的问题。

我有一个 Netty SimpleChannelInBoundHandler MainHandler 可以做两件事:-

  1. 接收缓冲区并异步创建一个通道,将该缓冲区代理到另一个目的地 D
  2. 对接收到的缓冲区进行自己的处理并将响应返回给客户端,而无需等待 1。

作为第 1 部分,我相信我需要显式保留缓冲区以将其向下游发送到目标通道 D。我是否还需要在该通道的 writeAndFlush() 之后释放此缓冲区?或者 Netty 管道会负责发布它吗?

基于 Netty 文档 https://netty.io/wiki/new-and-noteworthy-in-4.0.html,它说

When an outbound (a.k.a. downstream) message reaches at the beginning of the pipeline, Netty will release it after writing it out.
这让我认为 Netty 会在之后释放显式保留的缓冲区下游/目的地通道管道完成。这种理解正确吗? `

显式释放缓冲区会在下游管道中抛出 ReferenceCountUtilException

java memory-management memory-leaks netty bytebuffer
1个回答
0
投票
  1. 每次调用

    WriteAndFlush
    时,bytebuf的引用计数
    refCnt
    都会被设置为0,从而释放它。 但当有多个客户端连接时,并不能保证在所有消息发送完毕之前byteBuff不被释放,需要手动添加byteBuff
    .retain()
    ,使引用计数增加1。

  2. 可以在try-finally中添加

    .release()

    int count = byteBuf.refCnt();
    if(count0!=0){
        byteBuf.release();
    }
    
© www.soinside.com 2019 - 2024. All rights reserved.