为何Task Manager与Python psutil测量的进程内存存在差异?
问题:psutil测量内存与Windows任务管理器不一致的原因及解决方法
问题背景
使用Python 3.12.2 x64 + psutil 5.9.8在Windows 10 Pro x64下编写脚本记录应用内存使用时,发现psutil测量的结果始终比Windows任务管理器显示的高4-10MB,需要找到原因并获取与任务管理器一致的指标(用于和软件提供商对齐调试)。
当前使用的代码:
import psutil import sys def get_memory_use_of_process(target_process_name ): try: for proc in psutil.process_iter(['name', 'memory_percent', 'memory_info']): if target_process_name.lower() in proc.info['name'].lower().strip(): # 原注释认为memory_info[0]对应任务管理器的“Mem Usage” return proc.info['memory_info'][0]/1024/1024 # 转换为MB except: sys.exit() else: sys.exit("No needed process found")
差异原因
- 指标定义不匹配
psutil的memory_info()[0](即wset字段)对应Windows的工作集(Working Set),包含进程加载的所有内存页——包括和其他进程共享的部分(比如系统通用DLL)。而Windows 10任务管理器默认显示的“内存”列,实际对应的是专用工作集(Private Working Set),仅统计进程独占、无法与其他进程共享的内存页。这是两者数值差异的核心原因。 - 采样时机微小差异
内存使用是动态变化的,任务管理器和psutil的采样时间点可能略有不同,会导致极小的数值波动,但这部分差异远小于4-10MB。
正确测量方法
要和任务管理器显示的结果一致,需要获取专用工作集指标,对应psutil中的memory_info().private字段(或元组索引[6])。修改后的代码如下:
import psutil import sys def get_memory_use_of_process(target_process_name ): try: for proc in psutil.process_iter(['name', 'memory_info']): if target_process_name.lower() in proc.info['name'].lower().strip(): # 获取专用工作集,与任务管理器默认“内存”列一致 return proc.info['memory_info'].private / 1024 / 1024 except Exception as e: sys.exit(f"Error: {str(e)}") else: sys.exit("No needed process found")
验证步骤
- 打开任务管理器,右键“内存”列,选择“选择列”,确认当前显示的是“专用工作集”。
- 运行修改后的脚本,对比数值,应该和任务管理器显示的结果基本一致(误差在1MB以内)。
内容的提问来源于stack exchange,提问作者Araneus0390
相关产品推荐
相关产品推荐

