Blog
Production error deep-dives — root cause, reproduction, and the fix that holds.
How to Use Sealed Classes and Interfaces in Java 21
Build a currency-rate feed in Java 21 where the compiler flags every switch you forgot to update. Sealed interfaces, records and sealed classes, step by step.
How to Use WatchService in Java to Watch a Directory
Build a folder watcher in Java 21 with WatchService. It copes with half-written files, duplicate events and overflow, and ships with 23 passing checks.
Virtual Thread Pinning: Why synchronized Froze Your App
Virtual threads pinned by synchronized collapse throughput to your CPU count and can hang outright. Diagnose pinning on JDK 21 and fix it on 24+.
Java InvalidClassException: local class incompatible
InvalidClassException: local class incompatible means the stream's serialVersionUID no longer matches your class. Here is why it drifted, and how to fix it without losing data.
Strange Java Stack Frames: lambda$0, $1, init and Proxies
A lambda$main$0 stack trace, access$000, <init>, $Proxy0: what odd frame names in a Java stack trace mean, where javac puts them, and how to read past them.
Async Stack Traces in Java: CompletableFuture and Executors
A CompletableFuture stack trace points at a pool worker and says nothing about who submitted the task. How to read async Java traces and get that context back.
Too Many Open Files in Java: File Descriptor Leaks Fixed
java.io.IOException: Too many open files means you hit the descriptor limit. How to count FDs, find the leak with /proc and lsof, and set limits that hold.
OutOfMemoryError: Direct buffer memory: Causes and Fixes
OutOfMemoryError: Direct buffer memory means off-heap buffers hit their cap while the heap looks idle. Why GC frees them too late, and the fixes that work.
Finding Java Memory Leaks with Heap Dumps, Step by Step
Heap keeps climbing after every full GC? How to confirm a Java memory leak, take the right heap dumps, compare them, and walk from the leak back to the code.