MAATRIX / Блог / VPS для Java и Spring Boot: jar, systemd, память JVM

VPS для Java и Spring Boot: jar, systemd, память JVM

Блог MAATRIX · 2026-07-07

Spring Boot собирается в исполняемый fat-jar со встроенным Tomcat — деплой сводится к запуску одного файла. Разберём установку JDK, запуск под systemd, настройку памяти JVM и проксирование через nginx.

Особенности Java на VPS

['Главное, что нужно учитывать при деплое Java, — потребление памяти. JVM резервирует heap и метапространство, и на сервере с 1 ГБ RAM Spring Boot может стартовать впритык. Для комфортной работы обычно берут от 2 ГБ.', 'Зато Spring Boot предельно упрощает деплой: fat-jar включает встроенный веб-сервер и все зависимости. Не нужно ставить и настраивать отдельный Tomcat — достаточно JRE и одной команды java -jar.', '
  • Fat-jar — всё в одном файле, включая сервер.
  • Требователен к RAM — планируйте heap заранее.
  • Стабильность — проверенная временем экосистема и зрелые инструменты мониторинга.
']

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.

Арендовать VPS для Java

Установка JDK

['Для запуска достаточно JRE, но чаще ставят полный JDK. Возьмём OpenJDK 21 LTS из репозиториев.', '
sudo apt update && sudo apt install -y openjdk-21-jre-headless nginx\njava -version
', 'Проверьте версию: команда java -version должна показать 21. Заведём пользователя и каталог для приложения:', '
sudo useradd -r -s /usr/sbin/nologin springapp\nsudo mkdir -p /opt/springapp\nsudo chown springapp:springapp /opt/springapp
']

Сборка и копирование jar

['Собираем локально через Maven или Gradle. Результат — исполняемый jar в target или build/libs.', '
./mvnw clean package -DskipTests\n# или\n./gradlew bootJar
', '
scp target/app-0.0.1-SNAPSHOT.jar springapp@SERVER_IP:/opt/springapp/app.jar
', 'Профиль production удобно вынести в отдельный application-prod.yml и активировать его переменной окружения. Так вы не смешиваете настройки БД и логирования боевого контура с локальной разработкой.', '
SPRING_PROFILES_ACTIVE=prod java -jar app.jar
']

systemd и память JVM

['Ключевой момент — явно ограничить heap флагами -Xms и -Xmx, иначе JVM может забрать до четверти RAM и упереться в лимит. Для сервера с 2 ГБ разумно выделить около 1 ГБ под heap.', '
[Unit]\nDescription=Spring Boot app\nAfter=network.target\n\n[Service]\nUser=springapp\nWorkingDirectory=/opt/springapp\nExecStart=/usr/bin/java -Xms256m -Xmx1024m -jar /opt/springapp/app.jar\nSuccessExitStatus=143\nRestart=always\nRestartSec=5\nEnvironment=SERVER_PORT=8080\n\n[Install]\nWantedBy=multi-user.target
', '
sudo systemctl daemon-reload\nsudo systemctl enable --now springapp\njournalctl -u springapp -f
', 'Флаг SuccessExitStatus=143 нужен, чтобы systemd не считал корректную остановку по SIGTERM ошибкой. Начиная с Java 10+ JVM умеет читать лимиты контейнера и cgroup, но на голом VPS полагаться на автоопределение не стоит — явные -Xms и -Xmx дают предсказуемое поведение.', 'Полезно сразу включить дамп кучи при переполнении памяти: тогда после OOM у вас останется файл для анализа, а не только строчка в логе. Добавьте в ExecStart флаги -XX:+HeapDumpOnOutOfMemoryError и укажите каталог для дампов.', '
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/springapp/dumps/
']

nginx и HTTPS

['Приложение слушает 8080 на localhost, nginx отдаёт наружу 80/443 и терминирует TLS.', '
server {\n    listen 80;\n    server_name example.com;\n    location / {\n        proxy_pass http://127.0.0.1:8080;\n        proxy_set_header Host $host;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n}
', '
sudo nginx -t && sudo systemctl reload nginx\nsudo certbot --nginx -d example.com
']

Выбор конфигурации и ошибки

['Java-приложения выигрывают от быстрой памяти и диска: старт JVM и работа GC ощутимо приятнее на NVMe. AMD EPYC + NVMe у MAATRIX дают запас по CPU и I/O, а от $8/мес можно взять тариф под тестовый контур и вырасти под прод. Локации UK/США и оплата из России (карта РФ, СБП, крипта, MAAT) снимают барьеры с зарубежным сервером.', '
  • Нет -Xmx — JVM берёт слишком много RAM и падает по OOM.
  • 1 ГБ на прод — Spring Boot стартует на грани, берите от 2 ГБ.
  • Забыли SuccessExitStatus=143 — systemd логирует ложные ошибки при рестарте.
']

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.

Арендовать VPS для Java

Частые вопросы

Сколько памяти выделить JVM?

Ориентируйтесь на 50-60% доступной RAM под -Xmx, оставив запас системе и nginx. На 2 ГБ сервере разумно -Xmx1024m.

Нужен ли отдельный Tomcat?

Нет. Spring Boot включает встроенный сервер в fat-jar. Внешний Tomcat нужен только для классического war-деплоя.

Как ускорить старт Spring Boot?

Отключите ненужные автоконфигурации, используйте lazy initialization и рассмотрите GraalVM native image для критичных к времени старта сервисов.