The Memory Benchmark Nobody Asked For

Native image, memory, and the benchmark nobody warned you about.

A Micronaut 5.0.0 Space Observatory app — 16 REST endpoints, reactive R2DBC, 7-table PostgreSQL schema. The challenge: run it in a 256 MB container with swap disabled. GraalVM native image, garbage collector shootouts, invisible JVM memory, AOT bugs, and reactive backpressure tuning.

  1. Micronaut 5 Native Image: 14 Entries vs 1,913
  2. Native Image vs JVM at 128 MB
  3. The Observability Tax
  4. Every GC Failed at 256 MB (Except the Boring One)
  5. 107 MB of Invisible JVM RAM
  6. Your JVM Reports 151 MB. Your Container Uses 248.
  7. Three Bugs in a Trenchcoat Pretending to Be One Hang
  8. The AOT Hang That Wasn’t
  9. Seven Fixes, Zero Errors
  10. flatMap’s Second Argument Saved 1.7 Million Requests
  11. Loom Carrier on a Reactive Stack: 78 MB for Free
  12. We Removed Reactor. Nothing Got Slower.
  13. Error Is Not Exception: Micrometer’s Silent CPU Metric on Native Image
  14. ExecutorType.VIRTUAL Doesn’t Exist
  15. 265 req/s on All Three Runtimes (Until You Add a Memory Limit)
  16. Designed a Reactive Benchmark. Imperative Won.
  17. The Throughput Was Always 115
  18. Quarkus 12,563 vs Spring 820 (Both Numbers Are Wrong)
  19. -Xmx Won’t Save Your Native Image
  20. 1% CPU and 6-Second Latency
  21. Two ways to mistranslate a retry
  22. Three Front Doors, One Engine
  23. Six OOMs and a Connection Pool
  24. Four Bugs the Tests Couldn’t See
  25. Every Route Registered. Every Request 404’d.
  26. 16,700 Classes Before Your First Request
  27. Eight Connections, Zero Available
  28. 2492, 2495, 2508
  29. Native Image Grew to 734 MB