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

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.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Особенности 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
java -version

Проверьте версию: команда java -version должна показать 21. Заведём пользователя и каталог для приложения:

sudo useradd -r -s /usr/sbin/nologin springapp
sudo mkdir -p /opt/springapp
sudo chown springapp:springapp /opt/springapp

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

Собираем локально через Maven или Gradle. Результат — исполняемый jar в target или build/libs.

./mvnw clean package -DskipTests
# или
./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]
Description=Spring Boot app
After=network.target

[Service]
User=springapp
WorkingDirectory=/opt/springapp
ExecStart=/usr/bin/java -Xms256m -Xmx1024m -jar /opt/springapp/app.jar
SuccessExitStatus=143
Restart=always
RestartSec=5
Environment=SERVER_PORT=8080

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now springapp
journalctl -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 {
    listen 80;
    server_name example.com;
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
sudo nginx -t && sudo systemctl reload nginx
sudo 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

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

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

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

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

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

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

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

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