Open mgmeiner opened 2 years ago
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.
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
2.6.13 Java version: 17 I have provided 1024M for direct buffer and still getting error. -XX:MaxDirectMemorySize=1024M
Confirm this with java 21, spring-boot 3.3.5, -XX:MaxDirectMemorySize=80M
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:
(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.