posts
- Seven Fixes, Zero Errors
The fix for "JVM dies at 256 MB under load" was not a JVM flag. Part 4 ended with Serial GC — the only GC that fits in 256 MB — serving 4,550 requests before the OOM killer showed up. 81% error rate. Same flags, same container, same load profile. Seven code …
- The AOT Hang That Wasn't
One line in my notes: "Micronaut AOT hangs native image — keep both false. AOT disabled." Five sessions. Five different engineers (all me, different days). Nobody questioned it. The line accreted authority through repetition, the way all project folklore does. …
- Three Bugs in a Trenchcoat Pretending to Be One Hang
The task list for this project had a one-liner that persisted for a week: "Micronaut AOT hangs — keep disabled." Every developer who touched the project read that line, nodded, and moved on. AOT disabled. Property set to false. Life continued. Nobody …
- Your JVM Reports 151 MB. Your Container Uses 248.
151 MB. That's what micrometer-prometheus reports for the JVM at 256 MB after serving 1.66 million requests. Heap 35 MB, metaspace 72 MB, compressed class space 13 MB, code cache 16 MB, direct buffers 0.75 MB. Add it up. 137 MB. Rounded generously: 151 MB with …
- 107 MB of Invisible JVM RAM
Prometheus says 137 MB. Docker says 244 MiB. /proc/PID/smaps is the only witness that doesn't lie. The Discrepancy#JVM at 256 MB, Serial GC, after serving 1.66 million requests. Measured at idle: Docker stats: 244.2 MiB / 256 MiB (95.38%) Prometheus reports: …
- FiiO X1 FTL reversed: the map was in the OOB bytes I never dumped
The FiiO X1's flash translation layer rebuilds its block map from the spare bytes of each block's first page. My NAND dump kept 2,048 bytes a page.
- FiiO X1 PCM5142 DSP blocks: the flat head I believed
Three FiiO X1 firmware blocks the DAC loads per stream looked like passthrough filters, until the decoder read all 2,708 bytes of each one.
- Carving a SQLite database from a FiiO X1's raw NAND
One SQLite header in a FiiO X1's 128 MB NAND dump: a malformed carve, sqlite3 .recover, six of my own tracks and a previous owner's ten favourites.
- FiiO X1 EQ table: seven register bytes my generator never read
Decoding the FiiO X1's PCM5142 EQ coefficient table: the format was fine, the register bytes were not, and my first proof of the layout was wrong too.
- Every GC Failed at 256 MB (Except the Boring One)
Update, 2026-10-25: An earlier version said Serial is the only garbage collector in GraalVM Community Edition native images. CE also ships Epsilon (--gc=epsilon), a no-op collector that never frees memory and is meant for short-lived programs. For a service, …