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