2017-02-02 9 views
0

Im работает над процессом java внутри докера. Я установил xms (388m) и xmx (388m). Когда приложение запускается, потребление памяти в контейнере превышает и достигает наибольшего размера памяти хоста, и контейнер уничтожается.Процесс Java внутри докера потребляет больше памяти, чем указанный предел Xmx

  • Когда я подключиться к процессу Java с помощью JProfiler я вижу, что куча меньше Xmx
  • Однако верхняя команда внутри контейнера показывает, что docker stats показывает
  • Когда я запускаю тот же самый процесс Java на хост-компьютер, использование памяти в пределах границы Xmx.

Детали:

  1. Docker версия 1.12.1, построить 23cf638
  2. хост ОС: Ubuntu 14.04
  3. Container Изображение: Ubuntu 14.04 (пробовал с Ubuntu 16.04 также)
  4. JRE: 1.8.0_77 (также используется 1.8.0_112, 1.8.0_121) (все это JRE-клиенты, я не могу использовать сервер JRE, так как для этого приложения требуется JavaFX. Я также использую монокль для запуска приложения в режиме безголоски)
  5. Cmd:

    Java -server -Djava.net.preferIPv4Stack = истина -Djavafx.monocle.headless = истина -Dglass.platform = Монокль -Dmonocle.platform = Безголовый -Dprism .order = SW -Djsse.enableSNIExtension = ложь -XX: + ExitOnOutOfMemoryError -XX: + HeapDumpOnOutOfMemoryError -Xms388m -Xmx388m -XX: MetaspaceSize = 32m -XX: MaxMetaspaceSize = 64m -jar MYAPP-1.0.jar

Я также попытался установить MALLOC_ARENAS_MAX = 4 (также пытался с 2 и 1) после прохождения нескольких форумов.

Я также пробовал настройку --memory and -memory-booking при запуске контейнера-докера. В этом случае контейнер уничтожается, когда он достигает предела памяти.

Наблюдение: через жизнь jvm он использует меньше Xmx (388 м). Однако docker stats продолжают увеличиваться и достигают ~ 1,2 г (память хоста составляет 2 г) и в какой-то момент вызывает OOM в java-процессе. Поэтому я предполагаю, что GC-освобожденная память не возвращает контейнерную ОС.

Любая помощь приветствуется.

EDIT:

Я был неправ.

  1. Даже вне контейнера (когда я бежал на хост) jvm потреблял одинаковый объем памяти. Так что это не проблема с докером
  2. Результаты верхней команды внутри и снаружи контейнера одинаковы.Однако память кучи, показанная в профилировщике, находилась в пределах
  3. Приложение использует веб-просмотр JavaFX, который создает много короткоживущих потоков. Я считаю, что это приводит к росту стека (не уверенный в возможности измерить это).
+0

Возможно, это связано с [этот вопрос] (http://stackoverflow.com/questions/40228866/optimizing-memory-leakage-in-javafx/40239829#40239829). – Itai

ответ

0

Я бы предложил ограничить ресурсы самой докер-контейнером. Если вы используете docker-compose для запуска вашего контейнера, тогда это можно легко сделать, используя - ресурс. Таким образом, существует ограничение на количество ресурсов, которые контейнер-докер берет из системы.

+0

Вопрос гласит, что они пытались ограничить его докером, но он просто убил процесс ... – Itai