Запускаете Java-приложение и через час получаете звонок, что сервер лежит? Знакомо.
По умолчанию JVM берёт столько памяти и CPU, сколько захочет. На проде это боль. Разберёмся, как это починить.
Память
Два главных флага:
•
-Xms512m — сколько памяти выделить сразу при старте•
-Xmx2g — максимум, выше которого heap не вырастетjava -Xms512m -Xmx2g -jar app.jar
Ставьте
-Xmx всегда. Без него JVM может решить, что ей нужна половина RAM сервера и будет права по своей логике.CPU / потоки
Ограничить количество потоков GC и компилятора:
-XX:ActiveProcessorCount=2
Особенно актуально в Docker/Kubernetes, ведь JVM видит все ядра хоста, а не контейнера. Без этого флага она создаст лишние потоки и будет драться за ресурсы.
Если запускаете в контейнере
Начиная с Java 11+ JVM умеет читать cgroup-лимиты контейнера автоматически. Но лучше явно включить:
-XX:+UseContainerSupport
И добавьте
-Xmx через переменную окружения, чтобы удобно менять без пересборки:JAVA_OPTS="-Xms256m -Xmx1g -XX:ActiveProcessorCount=2"
java $JAVA_OPTS -jar app.jar
📌 Итого: минимальный набор для продакшена
-Xms256m
-Xmx1g
-XX:ActiveProcessorCount=2
-XX:+UseContainerSupport
Дальше смотрите на метрики и подкручивайте под своё приложение.
➡️ Больше про Java без воды в канале. Подписывайтесь, там научат делать Java-Java
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека devops'a
#root_prompt