最近电脑越来越卡了,8G 内存开几个 Chrome 标签页就飙到 80%,看着任务管理器里那些“内存大户”就头疼。虽然 Windows 有自己的内存管理机制,但有时候它就是不太“积极”,非得等到内存快爆了才开始回收。
网上找了下,发现 Windows 其实有个 API 可以主动清理进程的内存工作集(Working Set),简单说就是把进程不常用的内存数据挪到虚拟内存里,腾出物理内存给其他程序用。效果嘛,就像给系统来了一次“内存瘦身”,各个进程的内存占用瞬间下降,但程序又不会关闭。
核心原理
关键就是 Windows 的 EmptyWorkingSet 这个 API,它会清空指定进程的工作集。配合 psutil 库遍历所有进程,就能实现一键全局清理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| import ctypes from ctypes import wintypes import psutil
psapi = ctypes.WinDLL('psapi', use_last_error=True) kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
OpenProcess = kernel32.OpenProcess OpenProcess.argtypes = [wintypes.DWORD, wintypes.BOOL, wintypes.DWORD] OpenProcess.restype = wintypes.HANDLE
EmptyWorkingSet = psapi.EmptyWorkingSet EmptyWorkingSet.argtypes = [wintypes.HANDLE] EmptyWorkingSet.restype = wintypes.BOOL
CloseHandle = kernel32.CloseHandle CloseHandle.argtypes = [wintypes.HANDLE] CloseHandle.restype = wintypes.BOOL
PROCESS_ALL_ACCESS = 0x001F0FFF
def clean_process(pid): try: handle = OpenProcess(PROCESS_ALL_ACCESS, False, pid) if handle and handle != 0: EmptyWorkingSet(handle) CloseHandle(handle) return True except: pass return False
print("=== 一键全局内存清理 ===") print("效果:所有软件内存瞬间下降,不关闭程序\n")
success = 0
for proc in psutil.process_iter(['pid', 'name']): try: pid = proc.pid name = proc.name()
if pid < 10: continue
if clean_process(pid): success += 1 print(f"✅ 已清理: {name} (PID:{pid})")
except: continue
print(f"\n🎉 清理完成!成功优化 {success} 个进程") print("👉 打开任务管理器查看内存变化!")
|
几个要注意的点
权限很重要:PROCESS_ALL_ACCESS 这个权限值不能写错,否则会清理失败。最开始我就试过用较低权限,结果什么也清不了。
不要动系统进程:PID 小于 10 的基本都是系统关键进程,动它们可能会出问题,所以代码里直接跳过了。
效果因人而异:清理后进程内存占用确实会下降,但如果程序马上又要用那些数据,Windows 会把它们从虚拟内存读回来,内存占用又上去了。所以这只是个“临时救急”的方案,真正的解决办法还是…加内存条。
怎么用?
先装依赖:
然后直接运行脚本就行。建议在内存占用高的时候试试,效果会比较明显。你可以一边开着任务管理器一边跑,看着内存占用往下掉还挺解压的。
不过话说回来,这个脚本也就是治标不治本。如果电脑经常内存不足,还是老老实实加根内存条比较靠谱。这个脚本就当是个小玩具,偶尔拿来给系统“透透气”也挺好的。