Настройки памяти для запуска сборок Maven в DockerJAVA

Программисты JAVA общаются здесь
Anonymous
Настройки памяти для запуска сборок Maven в Docker

Сообщение Anonymous »

TL;DR: Каковы наилучшие методы запуска сборок Maven в контейнерах с учетом ограничений памяти?
Дополнительная версия:
Наш процесс сборки использует сборки Maven в контейнерах Docker. В качестве аргумента скажем, что это параметры:
  • Каждый контейнер имеет жесткий лимит в 6 ГБ ОЗУ (

    Код: Выделить всё

    --memory=6g
    и --memory-swap=6g)
  • Сборка будет прекращена, если указанная сборка попытается использовать более указанных 6 ГБ
  • Каждая сборка Maven запускает тесты JUnit через плагин maven Surefire, который по умолчанию запускает все тесты в разветвленной JVM
Мы столкнулись с проблемой, из-за которой сборки иногда выходят за пределы памяти и завершаются. Проблемы, с которыми мы столкнулись и уже решили, были следующими:
  • Настройка --XX:MaxRAMPercentage=90 влияет как на исходную JVM, так и на раздвоенную JVM, используемую Surefire, в результате чего в общей сложности 180% всей оперативной памяти передается в кучу Java. Поэтому мы снизили это значение до более разумного -XX:MaxRAMPercentage=40, чтобы каждая JVM могла использовать 2,4 ГБ для своей собственной кучи.
  • Затем мы столкнулись с проблемой, что Java занимает абсурдное количество места помимо кучи. Если JVM использовала все свои 2,4 ГБ ОЗУ, у нее было 600 МБ метапространства и 250 МБ для сборщика мусора сверху. Определяется с помощью jcmd
    VM.native_memory.
  • Наконец, в некоторых сборках docker stats сообщает о более высоком использовании памяти, чем top, но, насколько я понимаю, это не проблема JVM, потому что это не «настоящая» используемая память, а вместо этого призрачная память, которая просто будет очищена, если дойдет до толчка.
Очевидно, что Maven использует гораздо больше памяти вне кучи, чем мы наивно ожидали. Не найдя статей, эссе или сообщений в блогах по этой проблеме (одна для Gradle, но мы используем Maven), я подхожу к вам, ребята, и спрашиваю: Существуют ли какие-либо передовые методы в отношении ограничений памяти для Maven в Docker? Есть ли какая-либо литература или «официальная» позиция людей Maven?

Вернуться в «JAVA»