gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 14:43:37 25 4
gpt4 key购买 nike

当我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com