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)}")
相关推荐
笨鸟先飞,勤能补拙5 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
微学AI5 小时前
一根针指向所有方向:挂谷猜想对 LLM Agent 技能-记忆架构的启示
开发语言·人工智能·架构·挂谷猜想
长和信泰光伏储能6 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
豆瓣鸡6 小时前
算法日记 - Day3
java·开发语言·算法
浦信仿真大讲堂6 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
韭菜炒鸡肝天6 小时前
VTK开发笔记(一):VTK介绍,Qt..+VSx+VTK.编译
开发语言·笔记·qt
Gu Gu Study6 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
Aaron - Wistron7 小时前
Web API C# (Furion版)带 单元测试
开发语言·后端·c#
笨鸟先飞,勤能补拙7 小时前
AI 赋能网络安全领域深度剖析
网络·人工智能·windows·安全·web安全·网络安全·github
卷无止境7 小时前
写代码这件事,到底该讲究点什么?
后端·python