使用psutil获取Windows进程内存:RSS与Private Working Set数值不符问题
解决Python获取Windows进程Private Working Set与任务管理器数值不一致的问题
兄弟,我太懂你这种困惑了——用psutil的process.memory_info().rss拿到的内存数值,和Windows任务管理器里的「Private Working Set(专用工作集)」差了一大截,查了半天文档也没找到对应字段,确实挺闹心的。
为什么数值对不上?
你用的rss对应的是进程的工作集(Working Set),这个统计范畴包含了进程共享的系统DLL、其他共享内存区域;而任务管理器的「专用工作集」是进程实打实独占的、没被其他进程共用的物理内存部分,两者统计的不是同一个东西,数值自然有差距。
正确的获取方式
要拿到和任务管理器完全匹配的「Private Working Set」数值,你需要用psutil的memory_full_info()方法里的private属性(这个字段是Windows系统下专门对应专用工作集的)。
代码示例:获取内存占用最高的前5个进程
下面是直接可用的代码,能列出内存占用Top5的进程及其专用工作集大小:
import psutil def get_top_private_memory_processes(top_n=5): process_list = [] # 遍历所有进程,过滤无权限访问的进程 for proc in psutil.process_iter(['pid', 'name']): try: # 获取完整内存信息,重点取private字段 full_mem_info = proc.memory_full_info() private_mem_bytes = full_mem_info.private # 转换为MB,和任务管理器显示单位一致 private_mem_mb = round(private_mem_bytes / (1024 * 1024), 2) process_list.append({ 'pid': proc.info['pid'], 'name': proc.info['name'], 'private_working_set': f"{private_mem_mb} MB" }) except (psutil.NoSuchProcess, psutil.AccessDenied): # 跳过已结束或无权限的进程 continue # 按专用工作集从高到低排序,取前top_n个 sorted_processes = sorted(process_list, key=lambda x: float(x['private_working_set'].split()[0]), reverse=True)[:top_n] return sorted_processes # 打印结果 top_processes = get_top_private_memory_processes(5) print("内存占用最高的前5个进程(专用工作集):") for index, proc in enumerate(top_processes, start=1): print(f"{index}. 进程名: {proc['name']} | PID: {proc['pid']} | 专用工作集: {proc['private_working_set']}")
小提示
- 代码里处理了
NoSuchProcess和AccessDenied异常,避免因为进程突然结束或权限不足导致程序崩溃; - 转换为MB单位是为了和任务管理器的默认显示保持一致,方便对比;
- 如果是在Linux系统下,
private字段对应的是私有内存,和Windows的统计逻辑略有不同,但在Windows上完全匹配任务管理器的「专用工作集」。
内容的提问来源于stack exchange,提问作者Spencer
相关产品推荐
相关产品推荐

