Почему java -Xms может превышать доступную память в контейнере docker? - PullRequest
1 голос
/ 04 февраля 2020

Я запускаю приложение 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 хоста.

...