python脚本实现windows电脑内存监控&内存清理(类似rammap清空工作集功能)

python 复制代码
import ctypes
import psutil
import time
import sys
import os
from datetime import datetime
import pyautogui


# 检查管理员权限
def is_admin():
    try:
        return ctypes.windll.shell32.IsUserAnAdmin()
    except:
        return False


# 内存清理核心功能
def cleanup_memory(aggressiveness=0.5):
    try:
        # 获取所有进程
        processes = psutil.process_iter()

        # 系统关键进程白名单
        system_processes = {
            "System Idle Process", "System", "svchost.exe",
            "wininit.exe", "csrss.exe", "lsass.exe"
        }

        # 初始化WinAPI
        PROCESS_QUERY_INFORMATION = 0x0400
        PROCESS_SET_QUOTA = 0x0100

        # 加载 psapi.dll
        psapi = ctypes.WinDLL('psapi', use_last_error=True)
        EmptyWorkingSet = psapi.EmptyWorkingSet
        EmptyWorkingSet.argtypes = [ctypes.c_void_p]

        cleaned = 0
        for proc in processes:
            try:
                # 获取进程信息
                pid = proc.pid
                name = proc.name()

                # 跳过系统关键进程和自身
                if name in system_processes or pid == os.getpid():
                    continue

                # 尝试获取进程句柄
                hProcess = ctypes.windll.kernel32.OpenProcess(
                    PROCESS_QUERY_INFORMATION | PROCESS_SET_QUOTA,
                    False,
                    pid
                )

                if hProcess:
                    # 尝试清空工作集
                    if EmptyWorkingSet(hProcess):
                        cleaned += 1
                    ctypes.windll.kernel32.CloseHandle(hProcess)

            except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
                continue

        return cleaned
    except Exception as e:
        print(f"清理过程中发生错误: {str(e)}")
        return 0


# 内存监控
def memory_monitor(threshold=30, interval=60, aggressiveness=0.5):
    print("内存监控已启动...")
    try:
        while True:
            mem = psutil.virtual_memory()
            used_percent = mem.percent
            print(
                f"--------------------\n{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} \n当前内存使用率: {used_percent}%(自动清理阈值:{threshold}%)")

            if used_percent > threshold:
                # print("开始清理内存...")
                cleaned = cleanup_memory(aggressiveness)
                print(f"已清理 {cleaned} 个进程的工作集内存...")

                # 清理后再次检查
                time.sleep(5)  # 预留清理过程的时间
                new_mem = psutil.virtual_memory()
                print(f"清理后内存使用率: {new_mem.percent}%")
                print(f"累计释放内存: {(mem.used - new_mem.used) // 1024 // 1024} MB")

            time.sleep(interval)
    except KeyboardInterrupt:
        print("\n监控已停止")


if __name__ == "__main__":
    if not is_admin():
        print("需要管理员权限运行!")
        ctypes.windll.shell32.ShellExecuteW(
            None, "runas", sys.executable, " ".join(sys.argv), None, 1)
        sys.exit()

    # 配置参数
    config = {
        'threshold': 30,  # 触发清理的内存使用率阈值(百分比)
        'interval': 600,  # 检查间隔(秒)
        'aggressiveness': 0.3  # 清理强度(0.1 ~ 1)
    }

    # 内存使用率阈值(百分比)
    try:
        config['threshold'] = int(pyautogui.prompt('请输入触发清理的内存使用率阈值-(整数)-(默认30%)!'))
    except:
        config['threshold'] = 30
    print(f"初始参数:\n--自动清理阈值:{config['threshold']}%")

    # 检查间隔(秒)
    try:
        config['interval'] = int(pyautogui.prompt('请设置检查间隔(秒)-(整数)-(默认600秒)!'))
    except:
        config['interval'] = 600
    print(f"--检查间隔:{config['interval']}秒")

    # 清理强度(0.1~1.0)
    try:
        config['aggressiveness'] = float(pyautogui.prompt('请设置清理强度(0.1 ~ 1)-(默认0.3)!'))
    except:
        config['aggressiveness'] = 0.3
    print(f"--清理强度(0.1 ~ 1):{config['aggressiveness']}")

    # 执行内存监控
    try:
        memory_monitor(**config)
    except Exception as e:
        print(f"程序发生错误: {str(e)}")
相关推荐
suuijbd1 小时前
单例模式和单例Bean
java·开发语言·单例模式
华梦岚1 小时前
Perl语言的语法糖
开发语言·后端·golang
厉君韵1 小时前
Scala语言的数据类型
开发语言·后端·golang
Jackson@ML2 小时前
Django开发入门 – 1.搭建基于Python Web框架Django的IDE开发环境
后端·python·django
霜雪殇璃2 小时前
2025.1.8(qt图形化界面之消息框)
开发语言·qt
初学者↑2 小时前
知识图谱可视化系统python+neo4j+vue3
python·知识图谱·neo4j
runscript.sh3 小时前
golang 开启HTTP代理认证
开发语言·http·golang
一念&4 小时前
python爬虫--简单登录
开发语言·爬虫·python
明月看潮生4 小时前
青少年编程与数学 02-008 Pyhon语言编程基础 26课题、常见框架
python·青少年编程·框架·编程语言·编程与数学
苏貝貝4 小时前
【C++】多态(下)
java·开发语言·c++