侧边栏壁纸
博主头像
木易成

聊聊软件、聊聊金融、聊聊篮球

  • 累计撰写 29 篇文章
  • 累计创建 18 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录

io.netty.util.internal.OutOfDirectMemoryError报错处理

木易成
2023-01-18 / 1 评论 / 0 点赞 / 5,788 阅读 / 276 字

问题描述

最近微服务上云后,gateway网关服务的内存一直上涨不回收,运行几天后在访问接口报错:io.netty.util.internal.OutOfDirectMemoryError: failed to allocate 16777216 byte(s) of direct memory (used: 2063597575, max: 2075918336)

排查方式

  1. 首先确定是服务的内存泄露问题
  2. 观察jvm相关参数,堆内内存一切正常,且堆内总内存设置了最大值不会一直增加(增加到最大值后GC)
  3. 堆内没问题可能就是堆外内存的问题,一通网上查询最终确定gateway的版本有问题,
<groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-gateway</artifactId>
    <version>2.2.6.RELEASE</version>

如下版本的NettyWriteResponseFilter代码中

protected DataBuffer wrap(ByteBuf byteBuf, ServerHttpResponse response) {
		if (response.bufferFactory() instanceof NettyDataBufferFactory) {
			NettyDataBufferFactory factory = (NettyDataBufferFactory) response
					.bufferFactory();
			return factory.wrap(byteBuf);
		}
		// MockServerHttpResponse creates these
		else if (response.bufferFactory() instanceof DefaultDataBufferFactory) {
			DefaultDataBufferFactory factory = (DefaultDataBufferFactory) response
					.bufferFactory();
             //此处存在内存泄露
			return factory.wrap(byteBuf.nioBuffer());
		}
		throw new IllegalArgumentException(
				"Unkown DataBufferFactory type " + response.bufferFactory().getClass());
	}

解决方案

将spring-cloud-gateway版本升级至2.2.6.RELEASE,问题解决

0

评论区