问题描述
最近微服务上云后,gateway网关服务的内存一直上涨不回收,运行几天后在访问接口报错:io.netty.util.internal.OutOfDirectMemoryError: failed to allocate 16777216 byte(s) of direct memory (used: 2063597575, max: 2075918336)
排查方式
- 首先确定是服务的内存泄露问题
- 观察jvm相关参数,堆内内存一切正常,且堆内总内存设置了最大值不会一直增加(增加到最大值后GC)
- 堆内没问题可能就是堆外内存的问题,一通网上查询最终确定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,问题解决
评论区