У меня есть Java-приложение, упакованное в Docker и размещенное на Amazon ECS.
Основные технологии:
Каждые 1-2 дня приложение аварийно завершает работу и снова просыпается, восстанавливаясь сервисом Amazon.
Под насекомым Docker я обнаружил причину:
"OOMKilled": true,
Я подключил привод к CloudWatch и обнаружил странное поведение с графиком потребления памяти:
![Memory consumption](https://i.stack.imgur.com/t566v.png)
Эти синие пики - это моменты, когда приложение зависало.
Я читал, что в Java 8 есть проблемы с правильным чтением максимального объема памяти для хоста, но:
1) Docker запускается с флагами, которые должны решить проблему
ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1 -Xms300M -XX:PermSize100M -Djava.security.egd=file:/dev/./urandom -jar /app.jar
2) В любом случае, у виртуальной машины есть 4 Гб оперативной памяти, поэтому максимальный пик ~ 1,3 Гб не должен убивать приложение.
3) Не было значительной нагрузки на сервер в моменты пиков