Java 应用容器化后,Pod 内存占用常超出 JVM 堆内存数倍,形成“消失的内存”。这主要源于三个层面:
JVM 内存(堆+堆外):堆内存由 -Xms/-Xmx 控制;堆外包括元空间、压缩类空间、代码缓冲区、直接缓冲、线程栈等,分别有参数限制。
非 JVM 内存(JNI 本地内存):通过本地方法接口调用 C/C++ 代码直接分配的内存。这部分内存没有工具可以获取其占用大小,是最容易造成内存黑洞的区域。代码中引用的各种包都可能使用 JNI 内存,如 ZLIB 压缩库不当使用就会导致泄漏。
C 库层和 OS 层:glibc ptmalloc 的 Arena 机制、Top Chunk 管理、Bins 缓存策略会导致内存片段和延迟释放;Linux 透明大页(THP)机制会将 4KB 页变成 2MB 大页,即使只用了 4KB 也会分配 2MB。




