benchmarks
- 16,700 Classes Before Your First Request
Quarkus JVM OOMs at 256 MB while Micronaut and Spring Boot fit. Not heap. Not a leak. It's 86 MB of metaspace that never shrinks.
- Every Route Registered. Every Request 404'd.
A registered Micronaut route returning 404 under load. The route matched. The controller ran. Mono.zip ate the response.
- The numbers lied until we fixed the ports
Same reactive app on Micronaut, Spring Boot, and Quarkus. The numbers lied until we fixed the harness AND the ports.
- Quarkus 12,563 vs Spring 820 (Both Numbers Are Wrong)
A Prometheus counter that resets on OOM crash-loops turned a 5x throughput advantage into a 15x deficit. The fix is six lines of awk.
- Four Bugs, Three Exit Codes From a Benchmark Orchestrator
Benchmark orchestrators that loop over branches for hours. Four bash bugs that made them look finished.
- 200 Virtual Users vs api.nasa.gov (DEMO_KEY)
A benchmark orchestrator with no mock guardrail ran 200 VUs against NASA, a small free ISS tracker, and a free weather API.
- The Throughput Was Always 115
28 mock APIs. Twelve benchmark scenarios. Two codebases. One number: 115 req/s.
- Designed a Reactive Benchmark. Imperative Won.
Built a reactive benchmark with realistic latency. The imperative rewrite survived memory pressure. Reactive didn't.
- 265 req/s on All Three Runtimes (Until You Add a Memory Limit)
Native image, JVM, and virtual threads all hit 265 req/s. Then the memory limit dropped.
- We Removed Reactor. Nothing Got Slower.
We took the entire reactive stack out. R2DBC, Mono, Flux, Reactor Core, loom-carrier, flatMap with its carefully-tuned concurrency arguments. Replaced it with JDBC, HikariCP, and blocking method calls. Same endpoints. Same Netty HTTP server. Same PostgreSQL. …