GraalVM native image

Тема дорожной карты · Spring Boot

Поддержка Native Image в Spring Boot, реализованная на базе GraalVM, компилирует Spring Boot-приложение AOT (ahead-of-time) в автономный нативный исполняемый файл, который запускается за миллисекунды и потребляет долю памяти JVM, что делает его идеальным для serverless-функций и контейнеризированных Kubernetes-микросервисов. AOT-движок Spring Boot 3.x обрабатывает контекст приложения во время сборки, генерируя reflect-config.json, resource-config.json и конфигурации прокси, чтобы инструмент GraalVM native-image мог устранить недостижимый код через анализ закрытого мира. Разработчики собирают нативные образы с помощью Maven- или Gradle-цели spring-boot:build-image с профилем native или напрямую вызывая native-image-maven-plugin, а результирующий Docker-образ, созданный через Cloud Native Buildpacks, как правило, на 60–80 % меньше аналогичного JVM-образа. Spring Boot Native Image совместим с большинством распространённых стартеров Spring Boot, включая Spring Security, Spring Data JPA с Hibernate, Spring Data MongoDB, Spring AMQP и Spring WebFlux, хотя динамическая загрузка классов и JDK-прокси могут потребовать явных хинтов @RegisterReflectionForBinding. Community-сборки GraalVM доступны для бесплатной загрузки, а поддержка нативных тестов Spring Boot через @SpringBootTest с useMainMethod = UseMainMethod.ALWAYS позволяет командам проверять совместимость с нативным режимом в CI-пайплайнах.

Как это работает

GraalVM native image: Docker-образы через Spring Boot bootBuildImage (Cloud Native Buildpacks — layered, secure, маленькие образы) или hand-written Dockerfile. GraalVM native image (./gradlew nativeCompile) — static binary с sub-100ms startup + меньше памяти, отлично для serverless, дорого по build time + framework support. Graceful shutdown (server.shutdown=graceful) даёт in-flight запросам завершиться на SIGTERM. Production-ready config: тюньте JVM, выставьте heap, включите Actuator, log JSON, конфигурируйте connection pools (HikariCP дефолты обычно ок).

Когда применять

Buildpacks для большинства случаев — layered cache, security patches, без Dockerfile в поддержке. Native image — для serverless или fast-start workloads; верифицируйте что все зависимости поддерживают. Всегда graceful shutdown в K8s деплоях — abrupt termination дропает in-flight запросы. Memory limits + JVM tuning явно (не полагайтесь на auto-detect в контейнерах).

Типичные ошибки

Ловушки GraalVM native image: деплой fat jar без health checks (K8s не может безопасно роутить трафик); 1GB+ Docker-образы со build artefacts (Buildpacks или multi-stage builds); нет graceful shutdown (rolling deploy дропает пользовательские запросы); JVM heap не выставлен, OOMKilled по K8s memory limit.

Связанные понятия

Полезные ресурсы