java
- A Broken AOT Cache Still Serves 200
By default the JVM logs one error and keeps running when its AOT cache is broken, so a Leyden tier without AOTMode=on can measure plain java -jar.
- No Manual Intervention Required
An LTS-to-LTS Quarkus bump, 3.33 to 3.40, changed no production Java and broke the tests twice: one class loaded twice, one database shared by six branches.
- Same Builder, Different Binary
One GraalVM builder image, one banner on every build log, 18 native binaries. Twelve came out PIE and six didn't, and nobody had touched a linker option.
- The Flag Was Verified. The File Was Never Read.
Spring's process-aot writes its own native-image.properties over yours. A verified GraalVM flag sat in the repo for 43 days and never reached the build.
- Health 200, API 200, Prometheus 000
A GraalVM 25i4 bump made native /prometheus stop answering. The reflection gap was old; a new default turned a missing metric into a hang.
- The Falsifier That Never Fired
Spring should wedge at 256MB like Micronaut, or the r2dbc-pool theory is wrong. Ten hours later Spring wedged harder. Quarkus never noticed.
- Eighteen Requests for One Redirect
One 302 from a stub upstream, four HTTP client stacks, four bills: 18, 6, 3 and 1 requests. Two sensible defaults, multiplied.
- The Baseline Was the Bug
The JVM platform-thread baseline was measuring virtual threads, and native's famous 8x was dispatch plus double the heap. Matched, the gap is memory.
- The Build Was Green the Whole Time
The migration compiled and its tests passed. Then the software ran, and five failures turned up that no build step had reported.
- Upgrade Errors That Named the Wrong Layer
Five Maven repos, three framework families, one JDK 25. Most errors pointed at a layer the fix didn't live in. The first failure printed nothing.