Skip to content

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.