Netty 4 中的缓冲区所有权:如何管理缓冲区生命周期?

2023-11-27

我一直在尝试编写一个 HTTP 客户端来同时获取多个提要(最多 1k),同时也是学习 Netty 4 的练习。

我的问题是,是否有关于新 ByteBuf 基础设施如何工作的很好的解释?谁“拥有”它们,它们如何共享(是吗?)? ChannelPipeline 中的每个 ChannelHandler 是否都有自己的 ByteBuf?

这是一个让我困惑的例子:

我将以下类的实例添加到 HTTP 客户端管道:

public class MyFilter extends MessageToMessageDecoder<HttpObject> {

    @Override
    protected Object decode(ChannelHandlerContext ctx, HttpObject msg) throws Exception {
        // do some work, but leave msg unchanged
        BufUtil.retain(msg); // Why do I need to call BufUtil.retain(msg) ???
        return msg;
}

如果我不在 msg 上调用 BufUtil.retain,它似乎会收到 GCd,并且会收到各种虚假错误。


HttpContent延伸ReferenceCounted跟踪它所持有的缓冲区的生命周期。当一个ReferenceCounted被实例化,它的生命开始于refCnt of 1。如果你打电话retain() on it, refCnt增加了。refCnt减少于release(),以及底层资源(ByteBuf在这种情况下)被销毁一次refCnt变成0.

通常,处理程序不需要保留对其完成处理的消息的引用,因为消息一旦处理后通常会被丢弃或转换为其他内容。所以,release()一旦处理程序完成处理消息,就必须对消息调用方法。这通常很容易出错,并且很容易导致资源泄漏。

为了避免很难追踪的泄漏,请延长SimpleChannelInboundHandler哪个调用release()处理消息后自动显示消息。

有关 Netty 中引用计数的更多信息,请阅读这个维基页面。它还为您提供了有关如何利用 Netty 的缓冲区泄漏检测机制来解决缓冲区泄漏问题的详细信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Netty 4 中的缓冲区所有权:如何管理缓冲区生命周期? 的相关文章

  • 写入操作的 Netty ChannelFuture 何时“完成”?

    在 Netty 4 中 确切地说 什么时候ChannelFuture对于写操作 假设NioSocketChannel 变得 完成 Netty 是否等待ACK包 中的输入和输出处理程序之间是否存在相互依赖关系 ChannelPipeline将
  • Micronaut ReadTimeoutException 异常

    我有一个提供 REST API 的 Grails 4 应用程序 端点之一有时会失败 但会出现以下异常 io micronaut http client exceptions ReadTimeoutException Read Timeout
  • netty-daxin-4(http&websocket)

    文章目录 http 服务端 NettyHttpServer HelloWorldServerHandler 客户端 ApiPost
  • netty源码:(24)EventExecutorChooserFactory类

    该类定义了一个内部接口EventExecutorChooser 该接口有一个方法 next EventExecutorChooserFactory类有个默认实现类 DefaultEventExecutorChooserFactory 该类有
  • jboss的netty中下游事件是如何工作的?

    刚刚开始使用 netty 来实现我自己的服务器 我花了一段时间才掌握它的窍门 但现在我能够通过编写自己的 MessageHandler 来接受客户端 并且在 messageReceived 内部我能够从缓冲区中读取数据并执行一些与接收到的数
  • 如何在 Netty 通道处理程序中安全地执行阻塞操作?

    我正在构建一个基于 Netty 的小型应用程序 该应用程序通过套接字连接 即 telnet ssh 执行 I O 操作 我正在使用 Netty 启动我的套接字服务器ServerBootstrap类 给出 类型的事件循环NioEventLoo
  • 使用 Netty 的 UDP 服务器中丢失大量 UDP 请求

    我用 Netty 编写了一个简单的 UDP 服务器 它只是在日志中打印出收到的消息 帧 为此 我创建了一个简单的帧解码器解码器和一个简单的消息处理程序 我还有一个可以顺序和 或并行发送多个请求的客户端 当我配置我的客户端测试器以顺序发送数百
  • Netty Channel.write 线程安全吗?

    我有一个 Netty 应用程序 我希望有多个线程写入通道 我只是想知道 Channel write 是否线程安全 从代码中可以看出 ChannelOutboundBuffer addMessage 方法本身不是线程安全的 然而 写入通道是
  • Netty:关闭通道时出现 ClosedChannelException

    为什么当我尝试关闭通道时 会抛出 ChannelClosedException 使用 Channel close 关闭 异常的堆栈跟踪 java nio channels ClosedChannelException at org jbos
  • 何时在 keepalive 打开的情况下调用channelInactive?

    我有一个 SimpleChannelInboundHandler 处理一些 http 请求 CacheServerHandler extends SimpleChannelInboundHandler
  • 如何知道Netty ByteBuf中是否没有数据可读取?

    我是 Netty 新手 文件传输的问题让我困惑了好几天 我想发送image文件从客户端到服务器 下面的代码是可执行的 但只有我shutdown服务器强制我可以正常打开收到的图像文件 否则 显示 您似乎没有查看此文件的权限 检查权限并重试 所
  • 为什么JDK NIO使用这么多anon_inode文件描述符?

    我正在使用 Sun 的 JDK 1 6 0 26 和 NIO 带有 Netty 在 lsof 中我看到数百个文件描述符anon inode lsof np 11225 fgrep w anon inode java 11225 nobody
  • 客户端 ECC SSL 证书包含“未知命名曲线”

    问题背景 我正在一个现有的库中工作 该库在远程服务器上使用 SSL 和 netty 框架 我遇到 SSL TLS 握手错误 错误如下 javax net ssl SSLProtocolException java io IOExceptio
  • Netty连接限制

    我正在开发一个使用 netty 3 6 5 的应用程序服务器 我想先了解一下期权积压的完整含义 另外 为什么没有关于 serverbootstrap 选项的文档来帮助我们开发人员 我的另一个问题是如何最好地限制服务器的并发连接数以获得更好的
  • 与Netty相比,vert.x如何实现卓越的性能?

    最近的TechEmpower 性能基准 http www techempower com benchmarks 一直在 Netty 之上展示 vert x 有时数量很大 根据其网站 vert x 使用 Netty 来实现 大部分网络 IO
  • Netty中如何发送带有POST参数的请求?

    我正在尝试在 Netty 中发送带有 POST 参数的请求 我搜索了 Netty API Google 和这里 Stack Overflow 但没有找到什么好的办法 这可能是我糟糕的搜索技巧的错 如果是这样 我道歉 有没有什么API可以轻松
  • Netty 处理程序未调用

    我正在尝试使用简单的服务器客户端应用程序进入 Netty 代码见下文 我正在努力解决两个问题 ConfigServerHandler 分别ConfigClientHandler 被正确调用 但是 FeedbackServerHandler
  • 不同的 Netty 版本及其用途

    我现在使用Netty有一段时间了 但永远无法解决这个问题 一个人可以下载四个不同的版本 其中三个正在积极开发中 3 x 4 0 x 4 1 x 5 x 据我了解 3 x 适用于 JRE 1 5 而 JRE 的其他所有版本都高于此版本 我使用
  • Netty:奇怪的 IndexOutOfBoundsException:readerIndex + 长度超过 writerIndex

    我目前正在通过 netty 发送不同的数据包 并且经常遇到这样的异常收到它们时 java lang IndexOutOfBoundsException readerIndex 39 length 32 exceeds writerIndex
  • 如何配置 Netty 记录器工厂以便查看 LoggingHandler 的输出?

    我正在使用带有 logback 的 slf4j 日志记录 并在我的应用程序的开头编写 InternalLoggerFactory setDefaultFactory new Slf4JLoggerFactory 然后我在管道中添加了一个新的

随机推荐

  • 在 matplotlib 中分页/滚动一组 2D 热图

    我正在生成一组 3D 数据的 2D 热图 我希望能够有一种机制来交互式地翻阅每个窗格 下面是一个简单的示例代码 我希望能够通过滑块 或其他方式 以交互方式查看两个窗格 即 z 0 1 这对于 matplotlib 是可能的吗 或者这是我在生
  • Matplotlib - 如何为一系列绘图设置 ylim()?

    我正在尝试制作一系列箱线图 每个箱线图都有不同的范围 我尝试通过确定每个单独系列的最大值和最小值来设置 ylim 然而 在许多情况下 最小值是异常值 因此绘图被压缩 如何选择绘图的 胡须 使用的相同限制 加上一个小边距 例如 现在我正在这样
  • 更改本机、phonegap/Cordova 构建的 iOS 应用程序中的键盘外观

    我想更改我的 Phonegap Cordova 构建的本机 iOS 应用程序中出现的所有键盘的背景颜色 如下所示 当然 我已经彻底搜索了这个问题 主要找到了两个相关答案 回答者here说 Objective C 代码可以添加到 PhoneG
  • 通过嵌套函数或多个参数列表进行 scala 柯里化

    在 Scala 中 我可以定义一个带有两个参数列表的函数 def myAdd x Int y Int x y 这使得定义部分应用函数变得容易 val plusFive myAdd 5 但是 我可以通过定义和返回嵌套函数来完成类似的事情 de
  • 如何将元素附加到 numpy 数组

    我想做相当于在 Numpy 中递归地在 python 列表中添加元素的操作 如以下代码所示 matrix open workfile w A for row in matrix A append row print A 我已经尝试过以下方法
  • 如何使用 C 函数执行 Shell 内置命令?

    我想通过像 execv 这样的 C 语言函数来执行 Linux 命令 pwd 问题是没有名为 pwd 的可执行文件 并且我无法执行 echo PWD 因为 echo 也是一个内置命令 找不到可执行文件 如果你只想在你的c程序中执行shell
  • 如何将自定义属性添加到 Magento 中的客户组?

    我们使用的是 Magento CE 1 7 0 0 我们正在尝试向客户组实体添加新属性 我们已使用以下安装脚本成功向客户添加自定义属性
  • Javascript/Regex 用于仅查找没有子域的根域名

    我进行了搜索 发现了很多类似的正则表达式示例 但不完全是我需要的 我希望能够传入以下网址并返回结果 www google com回报谷歌网站 子域名 are cool google com回报谷歌网站 并不重要子域名的长度如何 idont
  • BASH下运行的程序的颜色输出[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我需要能够使终端上的一些文本更加引人注目 我的想法是使文本着色 要么是实际的文本 要么是每个字母的矩形中的空间 想想 vi 的光标 我认为对我的应用程序重要的唯一两个额外规范是
  • 在我的 css 类中使用 Zoom:1 可以吗?

    每当我发现 IE 显示我的网站很奇怪 与 Chrome 和 Firefox 不同 时 我会尝试放置zoom 1在 css 类中显示奇怪的部分 很多时候这可以解决问题并使其看起来与其他浏览器一致 使用有问题吗zoom 1 我知道我的 CSS
  • CFMessagePort 和沙箱

    我正在调整 MacOS 应用程序以使用沙箱 它使用一个辅助应用程序 同一包中的 exe 当我尝试在控制台中使用 拒绝 mach lookup 消息调用 CFMessagePortCreateRemote 时 该应用程序会失败 我可以看到co
  • PHP mb_ereg_replace 未替换,而 preg_replace 按预期工作

    我正在尝试将字符串中所有非单词字符替换为空字符串 除了空格 并将所有多个空格放在一起作为一个空格 以下代码执行此操作 cleanedString preg replace w name cleanedString preg replace
  • 将 numpy 中数组元素的所有组合相乘

    注意 我对 只需使用 for 循环进行操作 之类的答案不感兴趣 我想以 numpyish 的方式进行操作 我是 Python 初学者 我想使用 numpy ndarray 执行以下操作 给定一个数字序列t和另一个数字序列b 对于每一个t i
  • Asyncio 检测断开连接挂起

    我在 Python 3 4 中使用 Asyncio 我将尝试解释到目前为止我正在做的事情以及我 认为 导致问题的原因 一方面 我有一个具有阻塞操作的 UDP 连接框架 我将从该流中获取的数据创建为 SSE 格式传递给客户端的 json 这一
  • 从 Brocfile 的构建中排除文件夹

    有没有办法从 Brocfile 或任何其他地方 的构建中排除文件夹 用例是打包 我有一个由 pod 内的子应用程序组成的应用程序 例如 app modules components app modules app1 app modules
  • jquery中有没有办法将点击事件绑定到div的左边框?

    我有一个div div div 有没有办法将点击事件绑定到这个div的左边框 提前致谢 div height 100px border 4px solid black padding 10px 请尝试这个方法 div click funct
  • Python 中的浏览文件或目录对话框

    我正在用 Python 做一个小项目 我想浏览文件或目录以获取它们的路径 我正在使用 Tkinter 但只能找到一个文件浏览器 filename tkFileDialog askopenfilename parent root title
  • Read.csv() 抛出错误

    我一直在尝试读取 Excel 文件 但似乎有问题 该文件以 Excel 格式存储在 Documents 文件夹中 这些是我收到的错误消息 table lt read csv file choose header T sep t Warnin
  • 使用 MongoDB 制作类似 Twitter 的时间线

    我需要的 假设您正在使用 MongoDB 并且有一个名为users 每个用户都有一个 以下 数组 其中包含 user id他所关注的人的信息 然后你就有了另一个收藏statuses 每个状态包含 id它的作者 如何向某个用户显示他所关注的人
  • Netty 4 中的缓冲区所有权:如何管理缓冲区生命周期?

    我一直在尝试编写一个 HTTP 客户端来同时获取多个提要 最多 1k 同时也是学习 Netty 4 的练习 我的问题是 是否有关于新 ByteBuf 基础设施如何工作的很好的解释 谁 拥有 它们 它们如何共享 是吗 ChannelPipel