上一题下一题

Java 服务部署后内存持续上涨,堆转储显示缓存对象数量正常,但进程 RSS 不断增加,如何区分堆外内存、直接内存和线程栈问题?

旗舰版
来源:huawei中级工程师RSS与堆内存差异分析线程栈内存分析直接内存监控堆外内存排查
答案解析

我会先把“堆外内存”和“直接内存”区分清楚:直接内存是堆外内存的一种,通常指 NIO ByteBuffer.allocateDirect 使用的 native memory;除此之外,JNI、压缩库、TLS、代码缓存等也可能占用堆外内存。RSS 是进程实际驻留物理内存,既包括 Java 堆,也包括线程栈、直接内存和其他 native 区域,所以堆对象数量正常并不能说明进程内存没有泄漏。

排查时我会先确认现象和基线:观察 RSS、Java 堆已用量、线程数是否同步增长,并检查容器内存限制、JVM 参数和近期版本变更。Linux 上可以用 ps、top 看进程 RSS,用 /proc/<pid /smaps rollup 或 pmap x <pid 看映射区域;需要更细粒度时再检查 smaps 中各映射的 RSS 和匿名页分布。

如果怀疑 JVM 管理的 native 内存,启动时开启 Native Memory Tracking,例如 XX:NativeMemoryTracking=summary,然后用 `jcmd <pid VM.native

登录后查看完整内容