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
.
Pingback: Running a JVM in a Container Without Getting Killed | Carlos Sanchez's Weblog
while java >= 10 does correctly recognize the docker limits for memory, you can use the new flag MaxRAMPercentage (example: -XX:MaxRAMPercentage=75) instead of the old MaxRAMFraction in order to tune more precisely the size of the heap vs the rest (stack,native…)
Does -Xmx not suffer the same problem as -XX:MaxRAMFraction in that it does not allow for off heap memory? Or does -Xmx include off heap memory in it’s limit while MaxRamFraction does not?
with Xmx you can control how much room you leave for off heap