当其他进程申请大量内存时,现有进程的内存占用为何会降低?
现象原因解释
你观察到的进程RSS下降是操作系统内核的内存调度机制导致的,和第二个进程的大内存申请触发的系统级内存回收直接相关,具体逻辑如下:
- 首先明确你统计的
memory_info().rss是常驻内存集(Resident Set Size),它代表进程当前实际占用的物理内存容量,不包含被换出到交换分区/交换文件的内存,也不包含已被内核回收、可后续从磁盘重新加载的只读代码页,这个数值完全由操作系统的内存调度逻辑动态调整,进程本身无法直接控制。 - 你执行的
big_var = "-" * 10 ** 10会申请约10GB的内存,这个过程会触发系统的内存回收逻辑:当可用物理内存不足以满足申请需求时,内核会扫描所有进程的内存页,优先把长期未被访问的冷页换出到交换区,或者直接回收干净的只读页(比如Python解释器加载的动态链接库代码页,需要时可以重新从磁盘读取)。 - 你的第一个监控脚本绝大多数时间处于
sleep阻塞状态,大部分内存页长期没有访问,属于典型的冷页,会被内核优先选作回收/换出的目标,这就直接导致它的RSS数值下降。 - 第二个进程因为内存申请超出系统可用阈值被OOM killer(内存溢出杀手)终止后,内核不会主动把之前换出的第一个进程的内存页重新加载回物理内存,只有当进程实际访问这些页触发缺页异常时才会重新加载,所以你会观测到第一个进程的RSS长期保持在较低的数值。
复现场景用到的代码
内存监控脚本
import os, psutil, time process = psutil.Process(os.getpid()) while True: time.sleep(1) print(process.memory_info().rss)
大内存申请语句
big_var = "-" * 10 ** 10
内容的提问来源于stack exchange,提问作者Gaspard Quenard
相关产品推荐
相关产品推荐

