Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Direct Buffer not freed and Netty Resource Leaks #28382

Open
mgmeiner opened this issue Apr 26, 2022 · 2 comments
Open

Direct Buffer not freed and Netty Resource Leaks #28382

mgmeiner opened this issue Apr 26, 2022 · 2 comments
Labels
in: web Issues in web modules (web, webmvc, webflux, websocket) type: bug A general bug

Comments

@mgmeiner
Copy link

mgmeiner commented Apr 26, 2022

First of all: I'm not sure if this is 100% the right place for this Issue as Netty, Reactor-Netty and Spring-Data mongodb are also involved.

After updating our Spring-Webflux app to 2.6.6 we encountered "java.lang.OutOfMemoryError Direct buffer memory" exceptions in our logs.

After some investigation I found out that the netty update to 4.1.75/4.1.76 might cause the problem.

When netty leak detection is set to paranoid we see the following leak report in our logs:

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: 
#1:
        io.netty.buffer.AdvancedLeakAwareByteBuf.writeBytes(AdvancedLeakAwareByteBuf.java:611)
        org.springframework.core.io.buffer.NettyDataBuffer.write(NettyDataBuffer.java:177)
        org.springframework.core.io.buffer.NettyDataBuffer.write(NettyDataBuffer.java:43)
        org.springframework.http.codec.json.AbstractJackson2Encoder.encodeStreamingValue(AbstractJackson2Encoder.java:286)
        org.springframework.http.codec.json.AbstractJackson2Encoder.lambda$encode$1(AbstractJackson2Encoder.java:168)
        reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:106)
...

(complete one attached as file)

The use case behind is: Streaming pretty large data as json (~70kb per json) from mongodb to the client using a spring-webflux application.

Before the update to Spring-Boot 2.6.6. (and the including netty update) the leak was also present in the logs but did not make any problems so far. When starting the app on Java 11 it also seems that the buffer is cleaned fine (probably by GC) - but using Java 17 we always see the "java.lang.OutOfMemoryError Direct buffer memory" exceptions.

Our App runs on Cloudfoundry with MaxDirectMemorySize set to 80M which before the update was always enough. Increasins the MaxDirectMemorySize just delays the overflow exceptions.

Example to Reproduce the Issue:

Here you find a small minimal example but is enough to reproduce the issue: webflux-buffer-overflow-demo

Look at the readme of the repository for prerequisites and launch instructions.

For watching the direct buffer pools i used JVisualVM with the Buffer Pools plugins installed.

@spring-projects-issues spring-projects-issues added the status: waiting-for-triage An issue we've not yet triaged or decided on label Apr 26, 2022
@mgmeiner
Copy link
Author

mgmeiner commented Apr 28, 2022

I do not think that the netty update has something to do with it anymore - also i guessed it for a long time but I'm also able to reproduce the buffer 'overflow' when using for example Spring-Boot Version 2.5.7 (netty 4.1.70) and MaxDirectMemorySize=128M on JRE 17.
When MaxDirectMemorySize set to 80M it works (no overflow - buffer gets cleaned, but the netty leak detection reports the above mentioned leak) - this is weird.

@rstoyanchev rstoyanchev added the in: web Issues in web modules (web, webmvc, webflux, websocket) label Feb 9, 2023
@poutsma poutsma added type: bug A general bug and removed status: waiting-for-triage An issue we've not yet triaged or decided on labels Dec 20, 2023
@poutsma poutsma added this to the General Backlog milestone Dec 20, 2023
@SubhamSinghal
Copy link

SubhamSinghal commented Apr 2, 2024

Is there any update on this? I am also facing same issue.
spring boot version: 2.6.13
Java version: 17

I have provided 1024M for direct buffer and still getting error. -XX:MaxDirectMemorySize=1024M

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
in: web Issues in web modules (web, webmvc, webflux, websocket) type: bug A general bug
Projects
None yet
Development

No branches or pull requests

5 participants