java
- Native Image Grew to 734 MB
Five things the benchmark taught me that the documentation didn't mention.
- 2492, 2495, 2508
Three frameworks, byte-identical DAOs, and the benchmark that collapsed to a rounding error.
- Eight Connections, Zero Available
Two reactive frameworks hit the same 60 rps wall. The pool said all 8 connections were busy. Postgres said they were idle.
- 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.
- Four Bugs That Needed Real Postgres to Exist
A code review found zero bugs. The benchmark found four. Each one required concurrent load against real Postgres to exist.
- Six OOMs and a Connection Pool
A Spring Boot imperative app OOM'd six different ways at 256MB. Each HTTP client swap revealed what was actually eating the heap.
- 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.
- Two ways to mistranslate a retry
Porting @Retryable to Quarkus and Spring produced two silent retry bugs. One was a fix that broke parity. Both passed every test.
- 1% CPU and 6-Second Latency
A Quarkus reactive app hit 18.8 req/s while CPU idled at 1%. Two stacked bottlenecks — a transaction annotation and a connection pool default — explained the 5x gap with Spring.