netty使用ChunkedWriteHandler发送TextWebSocketFrame消息导致内存溢出

文章讨论了Netty库中ChunkedWriteHandler的write方法在不同版本(4.1.50.Final和4.1.108.Final)中的变化,解决了旧版本可能导致内存无法回收的OOM问题。新版本通过预判消息类型优化了队列处理,避免了TextWebSocketFrame消息堆积。
摘要由CSDN通过智能技术生成

netty版本

		<dependency>
               <groupId>io.netty</groupId>
               <artifactId>netty-all</artifactId>
               <version>4.1.50.Final</version>
        </dependency>

此版本ChunkedWriteHandler 的write方法如下

public class ChunkedWriteHandler extends ChannelDuplexHandler {
	private final Queue<PendingWrite> queue = new ArrayDeque<PendingWrite>();
	
	@Override
    public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
        queue.add(new PendingWrite(msg, promise));
    }
}

源码可知所有的消息都会被放置queue队列中,同时也不会触发channel高低水位设置,在大量消息堆积时导致内存无法回收OOM。堆内存分析如下:
在这里插入图片描述
解决:升级netty版本!

		<dependency>
               <groupId>io.netty</groupId>
               <artifactId>netty-all</artifactId>
               <version>4.1.108.Final</version>
        </dependency>

高版本对write方法进行了优化:

public class ChunkedWriteHandler extends ChannelDuplexHandler {
	private final Queue<PendingWrite> queue = new ArrayDeque<PendingWrite>();
	
	@Override
    public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
        if (this.queueIsEmpty() && !(msg instanceof ChunkedInput)) {
            ctx.write(msg, promise);
        } else {
            this.allocateQueue();
            this.queue.add(new ChunkedWriteHandler.PendingWrite(msg, promise));
        }
    }
}

在加入queue前对消息类型进行了判断,因此TextWebSocketFrame消息将不会进入队列!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值