spring-guides/gs-spring-boot-docker

Suggested Dockerfile doesn't take Docker/Java8 memory issue into account

fransvanbuul opened this issue · 1 comments

There's a memory issue with running JVM inside a Docker container: for calculating heap size, it takes the memory size of the host into account, instead of the memory size of the container. This has been fixed in Java 9 and backported to Java 8u131. Detailed info on Carlos Sanchez' weblog.

I personally ran into this issue when creating a bunch of Spring Boot services, running them on Kubernetes and seeing them getting OOMKilled because of memory behavior.

There's a fix available in the form of a couple of new JVM flags. I'd like to suggest to add these to the Dockerfile that's included in this guide, so the entrypoint would look like:
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "-XX:+UnlockExperimentalVMOptions", "-XX:+UseCGroupMemoryLimitForHeap", "-jar", "/app.jar"]

(I'm not as sure about also using -XX:MaxRAMFraction=1 as mentioned in the blog.)

If agreed, I'll happily provide a pull request including this change to the Dockerfile and some notes.

dsyer commented

Obsolete since JDK 8u225 (I believe).