c – 由于64位进程的内存分配过多,Windows冻结
发布时间:2020-12-16 10:02:24 所属栏目:百科 来源:网络整理
导读:当我在 Windows(版本7及更高版本)上运行64位程序并且程序试图分配太多内存(接近100%的物理内存)时,系统会停止运行.如果我没有及时赶上它并杀死有问题的过程,系统将无法响应并需要重新启动.显然,程序不应该尝试分配如此多的内存,但是可能会发生错误,并且我希
当我在
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的线程来检测低物理内存条件并终止该过程.但你可能会发现这是误报. (这当然不应该留在生产代码中.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |