Skip to content

Blog

Production error deep-dives — root cause, reproduction, and the fix that holds.

ExecutorService Shutdown: shutdown, shutdownNow and close()

ExecutorService shutdown in Java, tested: what shutdown(), shutdownNow() and close() promise, why a JVM stays alive, and the two-phase routine I use.

ForkJoinPool in Java: Work-Stealing and the Common Pool

How ForkJoinPool really works: work-stealing deques, the common pool's size, and which blocking calls get a spare thread and which quietly stall it.

Allocation Profiling in Java: Finding Garbage Hot Spots

High GC overhead is usually one call site allocating too much. Allocation profiling in Java with JFR: read the weights, find the site, prove it in bytes/op.

CodeCache Is Full: Why Java Stops Compiling Hot Code

CodeCache is full. Compiler has been disabled. What the warning means on JDK 21, the throughput cliff I measured after it, and how to size the code cache.

SATB Garbage Collection and Tri-Color Marking in Java

SATB garbage collection explained: tri-color marking, the lost-object problem, and why G1 and Shenandoah keep garbage that dies mid-cycle. Lab included.

Object Promotion in Java: How Objects Reach Old Gen

Follow one object from Eden to Old Gen. Object promotion in Java hinges on an age table, not MaxTenuringThreshold, and survivor overflow can change it.

Long GC Pauses in Java: How to Find the Real Cause

Long GC pauses in Java often aren't the collector's fault. Tell CPU throttling, swap, evacuation failure and reference processing apart using the GC log.

JVM Safepoints Explained: What Stop-the-World Really Means

A GC log said 11.9 ms; my app froze for 1.5 s. How a JVM safepoint works, why one thread can stall them all, and what your collector changes.

JVM Native Memory: Code Cache, Direct Buffers and NMT

Heap is 4 GB, the process uses 7 GB. Where JVM native memory goes (stacks, direct buffers, code cache, Metaspace) and how NMT baseline and diff find it.

Java VerifyError: How JVM Bytecode Verification Works

Java VerifyError after an agent or library upgrade? How the JVM bytecode verifier works, what StackMapTable frames do, and why -Xverify:none is no fix.