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

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消息将不会进入队列!

相关推荐

  1. C语言 空指针导致内存溢出

    2024-04-02 15:20:01       67 阅读
  2. Spark 中 BroadCast 导致内存溢出(SparkFatalException)

    2024-04-02 15:20:01       61 阅读
  3. JVM实战(33)——内存溢出内存使用率过高

    2024-04-02 15:20:01       58 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-02 15:20:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-02 15:20:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-02 15:20:01       82 阅读
  4. Python语言-面向对象

    2024-04-02 15:20:01       91 阅读

热门阅读

  1. 【docker】基础背景 & Windows安装docker(WSL2)

    2024-04-02 15:20:01       40 阅读
  2. 关于oracle切换mysql8总结

    2024-04-02 15:20:01       32 阅读
  3. mysql调优

    2024-04-02 15:20:01       32 阅读
  4. Redis中的serverCron函数(一)

    2024-04-02 15:20:01       34 阅读
  5. POSTGRESQL中时间戳的奥秘timestamptz

    2024-04-02 15:20:01       38 阅读
  6. postcss简介

    2024-04-02 15:20:01       37 阅读