当前位置: 首页 > 知识库问答 >
问题:

ChannelInboundHandlerAdapter writeAndFlush(msg)方法是否在刷新后释放msg?

袁子瑜
2023-03-14

我正在使用ChannelInboundHandlerAdapter类并writeAndFlush来自channelRead()的每个消息;

public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { 
    ByteBuf msgBuffer = (ByteBuf)msg;
    BinaryWebSocketFrame frame= new BinaryWebSocketFrame(msgBuffer);
    ctx.writeAndFlush(frame);
}

在本例中:Netty是否释放“frame”和“msg”。我知道它们是reference counted object,因此当我尝试像下面这样手动释放它们时:

public void channelRead(ChannelHandlerContext ctx, Object msg) throws  Exception { 
    ByteBuf buf = (ByteBuf)msg;
    BinaryWebSocketFrame frame= new BinaryWebSocketFrame(buf);
    ctx.writeAndFlush(frame);
    buf.release();
    frame.release();
}

但在这种情况下,我会得到refCounted对象释放错误,如下所示:

io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1

起初,我依赖于netty发布相关实例,但它偶尔会在运行时给我带来内存泄漏错误。

在这种情况下如何减少内存占用,因为在每个channelRead事件中创建新实例并不是一个好主意,当您不能正确释放它们时。

共有1个答案

孟翰藻
2023-03-14

是的,如果调用writeandflush(...),基本上就是转移缓冲区的所有权。如果缓冲区被写入或写入失败,Netty本身将释放缓冲区。

 类似资料:
  • 我有一个JFRAME,它的setDefaultCloseAction到JFrame。DISPOSE_ON_CLOSE。但是问题是它的大部分线程在被处理后没有关闭。如果我把它放在JFrame上。Exit_ON_CLOSE我的整个系统退出,这不是我想要的。有没有办法在关闭后处理并完全释放它的所有线程和资源,而不是让我的所有系统退出?

  • 由于访问令牌的寿命很短,所以我使用刷新令牌来获得一个新的访问令牌。成功的令牌响应将包括以下内容(来自microsoft api doc的示例): 我已经读到refresh_token的生命期是有效的,直到撤销或90天不活动。既然我得到了一个新的刷新令牌,我需要用这个新的刷新令牌替换旧的刷新令牌吗?如果我做了,如何删除旧的刷新令牌? 谢了!

  • 我在自己的Web API上使用Oauth2,在Web应用程序上使用ASP.NET C#来使用该API。在我的web应用程序上,我正在进行HttpWebRequests。当我的访问令牌过期时,我调用一个方法“refreshToken”,该方法发出请求以获取新的访问令牌。这工作很好,没有问题...除了我得到的响应包含一个新的刷新令牌???我在等新的访问令牌。我甚至认为在没有再次传递凭据的情况下这是不可

  • 问题内容: 我在页面上有一张图片。我正在使用AJAX表单插件上传单个图片,并且在图片上传之后,我想刷新页面上已经存在的图片。 新上传的文件与旧文件的名称相同,所需要的只是一种刷新图像的方法。由于名称相同,因此缓存已成为一种障碍- 本文中介绍的方法无效。 有任何想法吗? 问题答案: 您链接的文章在这里不起作用,但是您可以使用图像上的查询字符串来中断缓存,如下所示: 这会迫使浏览器再次检查图像,因为时

  • 我已将STS更新到3.6.4版。释放当我尝试启动java项目时,我在控制台中收到以下错误消息: Fehler:Hauptklasse Files.springsource.vfabric-tc-server-Developers-2.9.3。发布。base-instance.conf.logging.propertieskonnte nicht gefunden oder geladen werd