Назад к блогу
Java 11 мин чтения

Оптимизация Spring Boot: пулы, кэш, JVM и профилирование

Практический чеклист ускорения Spring Boot 3 / Java 21: HikariCP, таймауты, кэш, GC в контейнере и измерение p95 до рефакторинга.

Spring BootPerformanceJVMHikariCP
Оптимизация Spring Boot: пулы, кэш, JVM и профилирование

Где обычно «течёт» производительность

В Spring Boot узкие места редко сидят в «магии» фреймворка. Чаще это: блокирующие вызовы в event-loop (если WebFlux смешан с JDBC), раздутый heap из‑за кэшей, медленные SQL без индексов, слишком маленький/большой connection pool и отсутствие таймаутов на исходящих HTTP-клиентах.

Пулы соединений и таймауты

Для HikariCP держите размер пула близким к формуле ~ connections = ((core_count * 2) + effective_spindle_count) для классических БД, но всегда проверяйте метриками. Обязательны:

  • connectionTimeout, maxLifetime;
  • query timeout / statement timeout на уровне БД;
  • таймауты RestClient/WebClient (connect + read).
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.connection-timeout=3000
spring.mvc.async.request-timeout=10s

Кэширование

Локальный Caffeine — для горячих справочников. Redis — когда нужен общий кэш между репликами. Всегда продумывайте инвалидацию и TTL, иначе получите stale reads. Для read-heavy API кэш на уровне сервиса часто даёт больший эффект, чем микрооптимизации JSON-сериализации.

JVM и контейнеры

На JDK 21 используйте контейнерные флаги (MaxRAMPercentage), следите за GC (G1 по умолчанию, ZGC — для low-latency сценариев). Virtual threads (Project Loom) хорошо помогают в high-concurrency blocking I/O на Spring MVC, но не заменяют нормальные индексы в БД.

Профилирование вместо догадок

Перед «оптимизацией» измерьте: Micrometer timers, p95/p99 latency, pool usage, GC logs. Async Profiler / JFR показывают hot methods. Нагрузочные тесты (k6, Gatling) на staging с продоподобными данными спасают от сюрпризов после релиза.

Старт и прогрев

Скорость старта важна в Kubernetes (scale-out, rolling update). Spring AOT, CDS/AppCDS и аккуратный exclusion автоконфигурации заметно сокращают cold start — об этом регулярно пишут команда Spring и инженеры платформ на Habr. Для scale-to-zero смотрят в сторону GraalVM native, понимая trade-offs по рефлексии и build time.

Вывод

Оптимизация Spring Boot — это дисциплина измерений: пулы, таймауты, кэш, SQL, JVM в контейнере и профилирование. Начните с SLO и метрик — код «ускорять» нужно только там, где это видно на графиках.

Алексей Прыбытков

Senior Software Developer

© 2026 Все права защищены