Guides
Why your JVM uses more memory than -Xmx
Everything a Java process keeps outside the heap — metaspace, code cache, thread stacks, GC structures, direct buffers — and how to size a container for all of it.
Choosing a garbage collector for containers
Serial, Parallel, G1 or ZGC? How pod size, CPU limits and latency requirements pick the collector — and what each one costs in memory.
Reading Native Memory Tracking output
How to enable NMT, capture a summary with jcmd, understand reserved vs committed and every category, and turn the numbers into a container limit.
MaxRAMPercentage done right
How the JVM sizes the heap from the container limit, why the default 25% and hand-picked percentages both fail, and how to compute a percentage you can trust.
OOMKilled troubleshooting checklist
Exit code 137 on a Java pod: how to tell kernel kills from JVM OutOfMemoryError, and a step-by-step checklist to find which memory region blew the limit.
What virtual threads change about memory
Heap-allocated stacks, carrier threads collapsing to the core count, and why a service sized for 200 platform threads gets a different memory profile after migrating.
Metaspace, demystified
What class metadata actually costs, why a ~1 GiB reservation is normal, what MetaspaceSize really does, and how to hunt classloader leaks with NMT and jcmd.
glibc malloc arenas: the RSS nobody accounts for
Why thread-heavy JVMs show RSS far above what NMT reports, how per-thread arenas multiply, and when MALLOC_ARENA_MAX=2 or jemalloc is the fix.
CDS, AOT cache and startup memory
How class-data sharing and the JDK 24/25 AOT cache trade disk and shared memory for faster startup, including the Spring Boot training-run flow.