OOMKilled at 60% Heap: When the JVM Can't See the Container's Limit
A Java service kept getting OOMKilled by Kubernetes while its own heap graphs sat calmly at 60% with gigabytes to spare. The JVM was healthy by every metric it reported. The kernel killed it anyway, because the memory the JVM does not count, off-heap buffers, thread stacks, and metaspace, pushed the whole process past a container limit the JVM was never looking at.