Дополнительная версия:
Наш процесс сборки использует сборки Maven в контейнерах Docker. В качестве аргумента скажем, что это параметры:
- Каждый контейнер имеет жесткий лимит в 6 ГБ ОЗУ (и --memory-swap=6g)
Код: Выделить всё
--memory=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, потому что это не «настоящая» используемая память, а вместо этого призрачная память, которая просто будет очищена, если дойдет до толчка.