Im работает над процессом java внутри докера. Я установил xms (388m) и xmx (388m). Когда приложение запускается, потребление памяти в контейнере превышает и достигает наибольшего размера памяти хоста, и контейнер уничтожается.Процесс Java внутри докера потребляет больше памяти, чем указанный предел Xmx
- Когда я подключиться к процессу Java с помощью JProfiler я вижу, что куча меньше Xmx
- Однако верхняя команда внутри контейнера показывает, что
docker stats
показывает - Когда я запускаю тот же самый процесс Java на хост-компьютер, использование памяти в пределах границы Xmx.
Детали:
- Docker версия 1.12.1, построить 23cf638
- хост ОС: Ubuntu 14.04
- Container Изображение: Ubuntu 14.04 (пробовал с Ubuntu 16.04 также)
- JRE: 1.8.0_77 (также используется 1.8.0_112, 1.8.0_121) (все это JRE-клиенты, я не могу использовать сервер JRE, так как для этого приложения требуется JavaFX. Я также использую монокль для запуска приложения в режиме безголоски)
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:
Я был неправ.
- Даже вне контейнера (когда я бежал на хост) jvm потреблял одинаковый объем памяти. Так что это не проблема с докером
- Результаты верхней команды внутри и снаружи контейнера одинаковы.Однако память кучи, показанная в профилировщике, находилась в пределах
- Приложение использует веб-просмотр JavaFX, который создает много короткоживущих потоков. Я считаю, что это приводит к росту стека (не уверенный в возможности измерить это).
Возможно, это связано с [этот вопрос] (http://stackoverflow.com/questions/40228866/optimizing-memory-leakage-in-javafx/40239829#40239829). – Itai