A follow up to Running a JVM in a Container Without Getting Killed
In Java 10 there is improved container integration.
No need to add extra flags, the JVM will use 1/4 of the container memory for heap.
$ docker run -m 1GB openjdk:10 java -XshowSettings:vm \ -version VM settings: Max. Heap Size (Estimated): 247.50M Using VM: OpenJDK 64-Bit Server VM openjdk version "10.0.1" 2018-04-17 OpenJDK Runtime Environment (build 10.0.1+10-Debian-4) OpenJDK 64-Bit Server VM (build 10.0.1+10-Debian-4, mixed mode)
Java 10 obsoletes the -XX:MaxRAM
parameter, as the JVM will correctly detect the value.
You can still use the -XX:MaxRAMFraction=1
option to squeeze all the memory from the container.
$ docker run -m 1GB openjdk:10 java -XshowSettings:vm \ -XX:MaxRAMFraction=1 -version OpenJDK 64-Bit Server VM warning: Option MaxRAMFraction was deprecated in version 10.0 and will likely be removed in a future release. VM settings: Max. Heap Size (Estimated): 989.88M Using VM: OpenJDK 64-Bit Server VM openjdk version "10.0.1" 2018-04-17 OpenJDK Runtime Environment (build 10.0.1+10-Debian-4) OpenJDK 64-Bit Server VM (build 10.0.1+10-Debian-4, mixed mode)
But it can be risky if your container uses off heap memory, as almost all the container memory is allocated to heap. You would have to either set -XX:MaxRAMFraction=2
and use only 50% of the container memory for heap, or resort to Xmx
.