Hi folks, according to some notes on the net (e.g. [1]) openjdk11 is aware of the container limits for calculating default heap size and some other internal parameters. Apparently this works very well for Docker. Sample:
# docker run -ti --rm --cpus 2 -m 4G debian root@c526096eb86e:/# apt update; apt install -y default-jdk : : done. done. Processing triggers for libgdk-pixbuf2.0-0:amd64 (2.38.1+dfsg-1) ... root@c526096eb86e:/# cat /sys/fs/cgroup/memory/memory.limit_in_bytes 4294967296 root@c526096eb86e:/# cat /sys/fs/cgroup/memory/memory.memsw.limit_in_bytes 8589934592 root@c526096eb86e:/# java -XX:MaxRAMPercentage=20.0 -XX:MinRAMPercentage=10.0 -XX:+PrintFlagsFinal -version | egrep MaxHeap\|RAMPercentage\|Container double InitialRAMPercentage = 1.562500 {product} {default} uintx MaxHeapFreeRatio = 70 {manageable} {default} size_t MaxHeapSize = 859832320 {product} {ergonomic} double MaxRAMPercentage = 20.000000 {product} {command line} double MinRAMPercentage = 10.000000 {product} {command line} bool PreferContainerQuotaForCPUCount = true {product} {default} bool UseContainerSupport = true {product} {default} openjdk version "11.0.6" 2020-01-14 OpenJDK Runtime Environment (build 11.0.6+10-post-Debian-1deb10u1) OpenJDK 64-Bit Server VM (build 11.0.6+10-post-Debian-1deb10u1, mixed mode, sharing) Check the MaxHeapSize. 20% of 4 GByte, as requested. For an LXC container running Debian and the same OpenJDK I get: root@debian10:~# cat /sys/fs/cgroup/memory/memory.limit_in_bytes 4294967296 root@debian10:~# cat /sys/fs/cgroup/memory/memory.memsw.limit_in_bytes 4294967296 root@debian10:~# java -XX:MaxRAMPercentage=20.0 -XX:MinRAMPercentage=10.0 -XX:+PrintFlagsFinal -version | egrep MaxHeap\|RAMPercentage\|Container double InitialRAMPercentage = 1.562500 {product} {default} uintx MaxHeapFreeRatio = 70 {manageable} {default} size_t MaxHeapSize = 13511950336 {product} {ergonomic} double MaxRAMPercentage = 20.000000 {product} {command line} double MinRAMPercentage = 10.000000 {product} {command line} bool PreferContainerQuotaForCPUCount = true {product} {default} bool UseContainerSupport = true {product} {default} openjdk version "11.0.6" 2020-01-14 OpenJDK Runtime Environment (build 11.0.6+10-post-Debian-1deb10u1) OpenJDK 64-Bit Server VM (build 11.0.6+10-post-Debian-1deb10u1, mixed mode, sharing) memory.limit_in_bytes is 4 GByte, but Java gives me a MaxHeapSize of 0.20 * 64GByte. Of course I don't want to blame you for bugs in OpenJDK, but I wonder how comes? Are there some mysterious params set in a Docker container, but missing in LXC? Every insightful comment is highly appreciated Harri 1: https://stackoverflow.com/questions/54292282/clarification-of-meaning-new-jvm-memory-parameters-initialrampercentage-and-minr/54297753#54297753 _______________________________________________ lxc-users mailing list lxc-users@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-users