You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何防止64位程序耗尽内存导致Windows系统卡顿或无响应?

如何限制64位进程内存使用以避免Windows系统卡顿

当然有办法!针对你描述的这种存在内存泄漏或高占用问题的程序,我们可以通过Windows Job Object给进程设置硬内存上限,一旦进程超过限制就会被系统终止,从根源上阻止它耗尽系统资源。这是目前最可靠的编程级防护方案,另外也有一些系统层面的补充手段,下面详细说明:

一、核心方案:用Windows Job Object管控进程内存

Job Object是Windows提供的进程组管控机制,能给一组进程设置各种资源限制(内存、CPU、IO等),非常适合用来隔离有问题的程序。

实现步骤(C++示例)

  1. 创建Job对象:
HANDLE hJob = CreateJobObject(NULL, L"MemoryRestrictedJob");
if (hJob == NULL) {
    // 处理创建失败逻辑
    return GetLastError();
}
  1. 设置内存限制参数:
    我们需要配置JOBOBJECT_EXTENDED_LIMIT_INFORMATION结构,指定进程能使用的最大虚拟内存或物理内存:
JOBOBJECT_EXTENDED_LIMIT_INFORMATION jobInfo = {0};
jobInfo.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_PROCESS_MEMORY | JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
// 给进程设置6GB虚拟内存上限(针对8GB系统,预留2GB给系统和后台进程)
jobInfo.ProcessMemoryLimit = 6LL * 1024 * 1024 * 1024;

if (!SetInformationJobObject(hJob, JobObjectExtendedLimitInformation, &jobInfo, sizeof(jobInfo))) {
    CloseHandle(hJob);
    return GetLastError();
}
  • JOB_OBJECT_LIMIT_PROCESS_MEMORY:开启进程内存硬限制
  • JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE:确保关闭Job对象时自动终止所有关联进程
  • 内存上限可以根据你的实际系统配置调整,核心是给系统预留足够的运行空间。
  1. 将目标进程关联到Job对象:
    如果是你自己启动的进程,在调用CreateProcess时先挂起进程,关联Job后再恢复运行:
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
si.cb = sizeof(si);

if (CreateProcess(L"path/to/your/flawed.exe", NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi)) {
    if (!AssignProcessToJobObject(hJob, pi.hProcess)) {
        // 关联失败则终止进程
        TerminateProcess(pi.hProcess, 1);
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
        CloseHandle(hJob);
        return GetLastError();
    }
    ResumeThread(pi.hThread);
    // 及时关闭无用句柄
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
} else {
    CloseHandle(hJob);
    return GetLastError();
}

如果是已经运行的进程,只要你有足够权限,也可以直接用AssignProcessToJobObject把它加入Job管控。

为什么选Job Object?

  • 硬限制:一旦进程超过内存上限,系统会直接终止它,不会让它继续占用虚拟内存引发页面文件疯狂读写
  • 隔离性:Job内的进程无法突破限制,即使程序有内存泄漏也不会扩散到系统层面

二、补充方案:系统层面临时调整

如果你不想写代码,也可以用系统自带工具应急:

  • 任务管理器:右键目标进程 → 设置优先级为「低」,同时将「内存优先级」设为「低」,让系统优先回收它的内存资源
  • 资源监视器:在「内存」标签页找到目标进程,右键选择「结束进程树」(如果程序会启动子进程的话)

三、注意事项

  • 权限要求:操作Job Object需要管理员权限,否则可能无法关联系统进程或高权限进程
  • 子进程管控:如果缺陷程序会启动子进程,记得禁用Job的JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK选项,确保子进程也被纳入管控
  • 上限调整:内存上限不要设得过高(比如接近8GB),否则还是可能触发页面文件操作;也不要太低,导致程序正常运行就被终止

最后还是建议,如果你能接触到缺陷代码的话,尽量修复内存泄漏问题——这才是长久之计,但防护方案可以帮你在修复前避免系统崩溃。

内容的提问来源于stack exchange,提问作者sharptooth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:15:55