Я запускаю приложение java в контейнере docker, а java позволяет мне указать размер -Xms, значительно превышающий объем памяти, доступный для контейнера. Почему это так?
При запуске вне контейнера я получаю ожидаемый результат:
$ free -g; java -Xms100g -version
total used free shared buff/cache available
Mem: 31 14 17 0 0 17
Swap: 28 0 28
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00007f5f60a00000, 71583137792, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 71583137792 bytes for committing reserved memory.
Но когда я запускаю ту же команду из docker контейнера
$ free -g; java -Xms100g -version
total used free shared buff/cache available
Mem: 4 0 3 0 0 3
Swap: 0 0 0
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1ubuntu1~18.04.1-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
Команда как-то успешно выполняется. При проверке параметров JVM не похоже, что контейнер переопределяет параметры JVM. Похоже, java считает, что успешно выделил размер кучи в 25 раз больше доступной памяти:
java -XX:+PrintFlagsFinal -Xms100g -version 2>&1 | grep InitialHeapSize
uintx InitialHeapSize := 107374182400 {product}
Почему это происходит?
Обе системы - Ubuntu 18.04.1 LTS ( WSL против FROM ubuntu:18.04
) и java 1.8.0_222. Docker рабочий стол 2.1.0.3 (38240). ОС Win10 хоста.