LEAK: ByteBuf.release() was not called before it's garbage-collected. (ReactiveMongoRepository)
See original GitHub issueI’m using ReactiveMongoRepository with Kotlin and I’m getting this memory leak error from time to time
LEAK: ByteBuf.release() was not called before it's garbage-collected. See https://netty.io/wiki/reference-counted-objects.html for more information. Recent access records:
Created at: io.netty.buffer.PooledByteBufAllocator.newDirectBuffer(PooledByteBufAllocator.java:385)
io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:187)
io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:178)
io.netty.buffer.AbstractByteBufAllocator.buffer(AbstractByteBufAllocator.java:115)
org.springframework.core.io.buffer.NettyDataBufferFactory.allocateBuffer(NettyDataBufferFactory.java:71)
org.springframework.core.io.buffer.NettyDataBufferFactory.allocateBuffer(NettyDataBufferFactory.java:39)
org.springframework.http.codec.json.AbstractJackson2Encoder.encodeValue(AbstractJackson2Encoder.java:236)
org.springframework.http.codec.ServerSentEventHttpMessageWriter.encodeEvent(ServerSentEventHttpMessageWriter.java:174)
org.springframework.http.codec.ServerSentEventHttpMessageWriter.lambda$encode$0(ServerSentEventHttpMessageWriter.java:160)
reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:106)
reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:120)
reactor.core.publisher.FluxUsingWhen$UsingWhenSubscriber.onNext(FluxUsingWhen.java:358)
reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79)
reactor.core.publisher.MonoFlatMapMany$FlatMapManyInner.onNext(MonoFlatMapMany.java:250)
reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.innerNext(FluxConcatMap.java:281)
reactor.core.publisher.FluxConcatMap$ConcatMapInner.onNext(FluxConcatMap.java:860)
reactor.core.publisher.FluxConcatMap$WeakScalarSubscription.request(FluxConcatMap.java:476)
reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2193)
reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.drain(FluxConcatMap.java:442)
reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.onNext(FluxConcatMap.java:250)
com.mongodb.reactivestreams.client.internal.AbstractSubscription.onNext(AbstractSubscription.java:155)
com.mongodb.reactivestreams.client.internal.AbstractSubscription.processResultsQueue(AbstractSubscription.java:230)
com.mongodb.reactivestreams.client.internal.AbstractSubscription.tryProcessResultsQueue(AbstractSubscription.java:185)
com.mongodb.reactivestreams.client.internal.MongoIterableSubscription.lambda$requestMoreData$1(MongoIterableSubscription.java:99)
com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:48)
com.mongodb.internal.operation.AsyncQueryBatchCursor.handleGetMoreQueryResult(AsyncQueryBatchCursor.java:351)
com.mongodb.internal.operation.AsyncQueryBatchCursor.access$600(AsyncQueryBatchCursor.java:56)
com.mongodb.internal.operation.AsyncQueryBatchCursor$CommandResultSingleResultCallback.onResult(AsyncQueryBatchCursor.java:383)
com.mongodb.internal.operation.AsyncQueryBatchCursor$CommandResultSingleResultCallback.onResult(AsyncQueryBatchCursor.java:356)
com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:48)
com.mongodb.internal.connection.DefaultServer$DefaultServerProtocolExecutor$2.onResult(DefaultServer.java:288)
com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:48)
com.mongodb.internal.connection.CommandProtocolImpl$1.onResult(CommandProtocolImpl.java:84)
com.mongodb.internal.connection.DefaultConnectionPool$PooledConnection$2.onResult(DefaultConnectionPool.java:530)
com.mongodb.internal.connection.UsageTrackingInternalConnection$2.onResult(UsageTrackingInternalConnection.java:142) c
om.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:48)
com.mongodb.internal.connection.InternalStreamConnection$2$1.onResult(InternalStreamConnection.java:463)
com.mongodb.internal.connection.InternalStreamConnection$2$1.onResult(InternalStreamConnection.java:440)
com.mongodb.internal.connection.InternalStreamConnection$MessageHeaderCallback$MessageCallback.onResult(InternalStreamConnection.java:745)
com.mongodb.internal.connection.InternalStreamConnection$MessageHeaderCallback$MessageCallback.onResult(InternalStreamConnection.java:712)
com.mongodb.internal.connection.InternalStreamConnection$5.completed(InternalStreamConnection.java:582)
com.mongodb.internal.connection.InternalStreamConnection$5.completed(InternalStreamConnection.java:579)
com.mongodb.connection.netty.NettyStream.readAsync(NettyStream.java:255)
com.mongodb.connection.netty.NettyStream.readAsync(NettyStream.java:214)
com.mongodb.internal.connection.InternalStreamConnection.readAsync(InternalStreamConnection.java:579)
com.mongodb.internal.connection.InternalStreamConnection.access$1100(InternalStreamConnection.java:78)
com.mongodb.internal.connection.InternalStreamConnection$MessageHeaderCallback.onResult(InternalStreamConnection.java:702)
com.mongodb.internal.connection.InternalStreamConnection$MessageHeaderCallback.onResult(InternalStreamConnection.java:687)
com.mongodb.internal.connection.InternalStreamConnection$5.completed(InternalStreamConnection.java:582)
com.mongodb.internal.connection.InternalStreamConnection$5.completed(InternalStreamConnection.java:579)
com.mongodb.connection.netty.NettyStream.readAsync(NettyStream.java:255)
com.mongodb.connection.netty.NettyStream.readAsync(NettyStream.java:214)
com.mongodb.connection.netty.NettyStream.handleReadResponse(NettyStream.java:285)
com.mongodb.connection.netty.NettyStream.access$800(NettyStream.java:69)
com.mongodb.connection.netty.NettyStream$InboundBufferHandler.channelRead0(NettyStream.java:344)
com.mongodb.connection.netty.NettyStream$InboundBufferHandler.channelRead0(NettyStream.java:341)
io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1533)
io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1282)
io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1329)
io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:508)
io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:447)
io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276)
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719)
io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)
io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)
io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) java.base/java.lang.Thread.run(Thread.java:834)
More detailed errors in this gist: https://gist.github.com/ramiloif/0194f6c248dfe9885b12e7da5ffc28aa
Also in stack overflow: https://stackoverflow.com/questions/66553698/leak-bytebuf-release-was-not-called-before-its-garbage-collected-reactivem
Expected Behavior
my usage is pretty basic so I do not expect to get memory leak errors.
Actual Behavior
Getting LEAK: ByteBuf.release() was not called before it’s garbage-collected. from time to time as well as com.mongodb.MongoException: Subscription has already been terminated
Steps to Reproduce
Didn’t find specific way to reproduce the error happens from time to time, couldn’t relate it to any specific operation.
Possible Solution
Your Environment
- Reactor version(s) used: spring boot version: 2.4.3 reactor-core: 3.4.3
spring-cloud-dependencies version: 2020.0.1
- JVM version (
java -version
): 11 - OS and version (eg.
uname -a
): adoptopenjdk/openjdk11:alpine
Issue Analytics
- State:
- Created 3 years ago
- Reactions:5
- Comments:11 (6 by maintainers)
Ok, version
4.1.1
@rabiori there is a fix in the Spring Framework. Please, check https://github.com/spring-projects/spring-framework/issues/26746 and give it a try.