Linux 会将暂时未使用的内存用于页缓存,因此单看 free 数值很低,不能判定系统即将耗尽内存。更有用的证据是可用内存变化、持续换页、进程实际驻留增长、应用延迟以及内核 OOM 记录。先判断压力影响范围,再追踪具体进程。
用 free -h 关注 available,它估计在不发生明显交换的情况下可供新任务使用的内存。连续运行 vmstat 1 观察交换输入输出、运行队列和阻塞情况。swap 已用量可能来自过去的压力;若换入换出持续发生、可用内存继续下降且业务延迟同步恶化,才说明当前压力更可能是活跃状态。
同时检查内核日志中的 OOM 记录,并确认服务是否运行在容器或受限的控制组中。主机尚有内存不代表容器配额没有触顶。容器限制、进程资源限制和主机总量应分别核对,否则容易把局部限额问题误判为整机内存不足。
用 ps -eo pid,comm,rss,vsz,%mem --sort=-rss 找出当前 RSS 较大的进程。RSS 表示驻留在物理内存中的页面,VSZ 表示进程虚拟地址空间,其中可包含尚未实际驻留的映射,因此不能把 VSZ 当作真实物理占用。多个进程共享库页面,直接相加 RSS 也会重复计数;需要精确归因时应使用能区分共享和私有页的进程内存明细。
按固定间隔记录同一进程的 RSS、请求量、线程数、堆使用、垃圾回收和队列长度。若在业务负载近似时 RSS 持续单调增长,负载回落后仍不回落,并且对象或分配指标也同步增长,泄漏可能性才提高。缓存未设置上限、批处理集中运行、应用预热和内存映射文件也会增大驻留占用,却不一定是泄漏。
结合运行时堆与原生内存指标判断增长来源。若堆稳定而进程 RSS 持续升高,需调查原生分配、线程栈、映射和缓冲区;若容器内只有单个服务被杀,优先检查该容器的限制与 OOM 事件。
swap 用量不为零不等于当前在换页;VSZ 很大不等于实际占满物理内存;某一刻 RSS 高也不能单独证明泄漏。调整缓存上限、降低并发或修复分配问题后,应在相似请求量下观察可用内存、换页速率、进程 RSS 和响应延迟持续稳定,并确认没有新增 OOM 事件。这样才能把“当下缓解”与“增长根因已受控”区分开。