OpenJDK 25's Project Leyden AOT caches deliver GraalVM-like startup speedups without ahead-of-time compilation constraints or loss of peak JIT throughput. To test whether downloading large enterprise AOT archives on Kubernetes offsets these gains, we conducted a 32-cell controlled study on Google Kubernetes Engine (GKE) using mnemo-warmup across four Spring Boot workload tiers (from a 54.3 MiB microservice up to a 223.5 MiB ThingsBoard CE monolith).

Key Performance Findings

  • Single-Pod Readiness: Single-pod startup times improved by 31% to 58%, cutting readiness time from 4.5s to 2.0s (-56%) on the minimal service and from 30.8s to 21.2s (-31%) on the ThingsBoard CE monolith.
  • Network Overhead: Fetching and SHA-256 verifying the 223.5 MiB archive over same-region GKE Artifact Registry took only 0.7s for single pods and 0.9s median during 9-pod HPA bursts.
  • Live HPA 1→9 Scale-Outs: Per-pod readiness improved by 22% to 49% under load, dropping median per-pod App Ready time from 55.3s to 43.3s on ThingsBoard and from 11.6s to 5.9s on the Standard tier.
  • Wall-Clock Speedups: Total end-to-end HPA scale-out duration was cut in half on lighter services, dropping from 110.9s to 54.2s (-51%) on the Minimal tier.

Workload Tiers & Benchmark Summary

Benchmarks ran on pinned Debian OpenJDK 25.0.4.1 (linux/amd64) on GKE Standard (12 vCPU / 64 GB E2):

Workload Tier App Stack / JAR Count AOT Archive Size Uncached Ready Best Cached Ready Max Speedup
1. Minimal Spring Web + Actuator (37 JARs) 54.30 MiB 4.5 s 2.0 s -56% (-2.5 s)
2. Standard Minimal + JPA/Hibernate, Postgres (70 JARs) 103.88 MiB 7.4 s 3.1 s -58% (-4.3 s)
3. Larger Standard + OpenAPI, Kafka, RabbitMQ (98 JARs) 115.97 MiB 8.7 s 3.9 s -55% (-4.8 s)
4. Heavy Monolith ThingsBoard CE 4.3.1.8 + Postgres (458 JARs) 223.52 MiB 30.8 s 21.2 s -31% (-9.6 s)

(Full details, data tables, and reproducible harness scripts are available in benchmarks/workload-tiers).

With these validations complete, mnemo-warmup transitions to its v0.3.0 beta release.

Frequently Asked Questions (FAQ)

  • What is mnemo-warmup? An open-source Kubernetes automation tool for OpenJDK AppCDS and Project Leyden AOT caches that requires no code or Dockerfile changes.
  • How fast are Java pods with mnemo-warmup? Single-pod readiness improves by 31% to 58%, while per-pod scaling times during HPA 1→9 bursts improve by 22% to 49%.
  • Do large archives cause network bottlenecks? No; on same-region cloud networks, streaming a 223.5 MiB archive takes under 1 second while saving up to 12 seconds per pod.
  • How does it work without code changes? It uses Kubernetes annotations, an asynchronous trainer CronJob, and a static Go launcher that executes Java directly as PID 1.
  • What happens if the OCI registry fails? The system is strictly fail-open; if an archive is missing or unverified, it falls back cleanly to a standard JVM boot.
  • When is it least effective? Speedups are minimal when startup is bottlenecked by disk I/O, multi-process wrapper scripts like SonarQube, or external database migration delays.
  • How does it compare to GraalVM Native Image? It preserves full C2 JIT throughput, supports dynamic reflection/agents, and avoids long native-image builds.