写在前面
安全管家助手什么的上总会带一个内存加快球,有关掉进程以及内存整理的功用。尽管本质上,内存整理仅仅个幌子实际没啥效果,但是当你深度整理之后,肉眼可见的内存下降确实很解压。不过每次都得翻开安全软件才干享受解压的快感实在是有些买椟还珠了,所以就想尝试一下自己写个玩玩。
内存整理
这里我运用python来编写。
查找了一下,我确定了两个计划,一个是经过windows自带的内存收回机制整理,另一个是经过windows供给的一个APIEmptyWorkingSet整理,下面我们就来比照一下。
windows自带的内存收回机制
经过申请大量的内存来触发windows的内存收回机制,然后整理内存。
import psutil
import ctypes
mem = psutil.virtual_memory()
size = mem.total // 2
buffer = ctypes.create_string_buffer(size)
del buffer
这里经过psutil获取到内存总数,并且经过ctypes库来创建了一个一半总数的缓冲区,随后立马删掉。
但是,这样会形成暂时的卡顿,并且肉眼可见的内存上涨。并且整理的不干净。果断抛弃这个计划,一点都不顺畅。
EmptyWorkingSet
EmptyWorkingSet是windows的一个API,它用来清空指定进程的内存中的作业集。将该程序所用的物理内存界说为脏页并转移到磁盘上的内存交换文件上,清空该进程占用的物理内存,当进程再次需求时会再次从外存进行加载。那么加载的过程中可能会导致暂时的卡顿。
市面上的加快球大多用的都应该是这个技术
经过psutil库,以及搭配win32相关的库,完成起来也很便利
import win32api
import win32con
import win32process
import psutil
for pid in psutil.pids():
try:
handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, False, pid)
win32process.SetProcessWorkingSetSize(handle, -1, -1)
win32api.EmptyWorkingSet(handle)
except Exception:
continue
而经过与某管家进行比照,发现效果大差不大,他们可能做了一些内存整理的优化。
进程终止
杀死进程就更简单了,这里为了避免出问题,我只保存他们的父进程,依旧是经过psutil来完成
import psutil
pid_set = set()
processes = []
# 只遍历正在运转的进程
for pid in psutil.pids():
if pid in pid_set:
continue
try:
proc = psutil.Process(pid)
except psutil.NoSuchProcess:
continue
# 只处理父进程
proc_p = proc.parent()
if proc_p is not None:
proc = proc_p
if proc.pid in pid_set:
continue
pid_set.add(proc.pid)
# 生成进程信息
process_info = proc.as_dict(attrs=['pid', 'name', 'username', 'status', 'memory_info'])
process.append(process_info)
而杀死进程则是经过如下代码完成,pid就是指定进程的pid
psutil.Process(pid).kill()
至此,中心功用算是搞完了
完好开发
既然是加快球,那肯定需求一个界面,这里自己随手PS画了个图,然后用PyQt5写了个界面出来(写的时候实在是恶心吐了)
最终的一个效果如下
双击便可进行内存整理
右键便可翻开进程办理,在进程办理界面点击右键即可封闭
每次只会显示内存占用最多的前十五个进程,点击即杀死进程
一起为了趣味性,我还设置了单次分数和成果,当你达到100分时,即可解锁蓝屏见证者称号。(狗头)
项目地址:github.com/SSRemex/Mem…
写在最终
这个项目就是个玩玩的,切勿在日常日子中运用,怕出问题。
再次着重,内存整理功用关于体系来说没有啥效果,因为windows本身的机制,彻底不需求内存整理,反而内存整理可能会形成一些卡顿的问题(因为要从头读取数据)。