c++ - Windows 由于 64 位进程的内存分配过多而死机

标签 c++ windows memory memory-management administrator

当我在 Windows(版本 7 及更高版本)上运行 64 位程序时,该程序试图分配太多内存(接近 100% 的物理内存),系统逐渐停止。如果我没有及时发现它并终止有问题的进程,系统将变得无响应并且需要硬重启。显然程序不应该尝试分配这么多内存,但可能会发生错误,我想保护其他正在运行的进程免受我在测试/调试时正在处理的代码中任何此类错误的影响。 (这在 32 位中不是什么大问题,因为逻辑内存限制为系统范围的内存阻塞提供了安全网。)

所以我有两个问题:

  • 进程能否限制其内存消耗? Windows 中有没有系统调用可以设置内存限制,这样超出限制的分配就会失败而不是让整个系统崩溃?

  • 或者,是否有任何方法可以设置系统范围内的每个进程内存限制或为特定应用程序设置限制?

这是导致我的计算机死机的示例代码。它是在 x86_amd64 配置中使用 Visual Studio 10.0 编译的,我在 Windows 8.1 下的 16 GB RAM 笔记本电脑上运行它。它尝试分配 32 GB 的内存。 风险自负。

int main(void)
{
    const static int csNumArrays=10, csArraySize=800000000;
    int i, j, **p;

    p=new int*[csNumArrays];
    for (i=0; i<csNumArrays; ++i)
    {
        p[i]=new int[csArraySize];
        for (j=0; j<csArraySize; ++j)
            p[i][j]=j;
    }
    return 0;
}

最佳答案

最好的选择可能是让进程将自己放入 Windows job 中。并申请 ProcessMemoryLimit选项。 (一个问题:如果进程已经在作业中,这将不起作用,例如,因为它作为启动脚本或计划任务运行。)您还可以使用相同的技术来限制另一个进程的内存使用您启动(或已经在运行)。

或者,您可以尝试启动一个使用 CreateResourceMemoryNotification 的线程检测物理内存不足的情况并终止进程。但您可能会发现这会受到误报的影响。 (这当然不应该留在生产代码中。)

关于c++ - Windows 由于 64 位进程的内存分配过多而死机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36697275/

相关文章:

c++ - 在只有 const shared_ptr 的 unordered_set 中找到一个 shared_ptr?

c++ - 对 CUDA 代码使用 C++ header 结构

windows - 管理用户的 Schtasks 权限错误?

c++ - std::unordered_map::reserve 是否保证只要映射中的元素较少就不会发生内存分配?

c++ - OpenMP 优化 for 循环的调度

c++标准实践: virtual interface classes vs.模板

.net - 处理大文件时正则表达式匹配中的 OutOfMemoryException

python - 如何使用python请求将图像下载到内存?

javascript - 允许网络摄像头在本地应用程序中不发出警告

windows - 在 Windows 7 中设置网络适配器指标优先级