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 Readytime 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.

