Вы должны сделать оба. Поскольку JVM была pre-docker и не работает с cgroups (больше информации здесь ), она не «видит» ограничения, которые вы накладываете на свои контейнеры, и пытается использовать больше, чем следует. Это было исправлено в Java9 +, где JVM адаптирована к контейнерам. Сильфон исправления будет работать для java:8u172b111
и выше.
- Получить изображение Docker с помощью
java:8u172b111
(например, anapsix/alpine-java:8u172b11_jdk
)
- Добавьте
JAVA_OPTS
со следующими значениями:
-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=2
- Ограничить память контейнера. Теперь JVM будет использовать cgroups при расчете объема используемой памяти.
Стоит отметить, что -XX:MaxRAMFraction=2
следует настроить в соответствии с вашим приложением, нагрузкой и количеством запущенных потоков.
Ребята из fabric8 проделали большую работу в создании изображений, которые вычисляют память контейнера и используют приблизительно 50% общей памяти как максимально допустимый (я думаю, что это также можно отрегулировать). И это работает для Java 7.