当前位置: 首页 > 知识库问答 >
问题:

由于64位进程内存分配过多,Windows冻结

能旭
2023-03-14

当我在Windows(版本7及以上)上运行一个64位程序时,程序试图分配太多的内存(接近100%的物理内存),系统就会停止运行。如果我不及时捕捉它并杀死冒犯的进程,系统将变得无响应,并需要硬重启。显然,程序不应该试图分配这么多内存,但是bug可能会发生,我希望在测试/调试时保护其他正在运行的进程免受代码中任何此类bug的影响。(在32位中,这不是一个问题,因为逻辑内存限制提供了一个系统范围内存阻塞的安全网。)

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

下面是导致我的计算机冻结的示例代码。它是在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;
}

共有1个答案

冯亮
2023-03-14

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

或者,您可以尝试旋转一个线程,该线程使用CreateResourceMemoryNotification来检测物理内存不足的情况并终止进程。但是你可能会发现这是假阳性的。(这当然不应该留在生产代码中。)

 类似资料:
  • 编辑: > 继Ingo Leonhardt之后,我在以root用户身份而不是以标准用户身份登录后尝试了。这样做解决了root的问题(然后程序可以在以root身份登录时分配所有物理内存)。但这只适用于root用户,不适用于其他用户。但是,至少这意味着原则上内核可以很好地处理这一点,而且只有一个配置问题。 关于:我尝试显式地添加 null > 这是我自己的愚蠢造成的。在我的用户设置中有一个(早已被遗忘

  • 我想了解为什么多次动态分配调用的数据比直接在代码中指定的或通过的单个调用分配的数据使用如此多的内存。 例如,我用C编写了以下两个代码: 测试1.c:int x用malloc分配 我在这里没有使用free来保持简单。当程序等待交互时,我查看另一个终端中的顶级功能,它向我显示了以下内容: test2. c: int x不是动态分配的 顶部显示: 我还编写了第三个代码,其结果与test2相同,我在tes

  • 我在配置oracle oci8 for windows时遇到问题 我使用Windows 7 64位,xampp v3.2.2,PHP 5.6.15和甲骨文g11快递 我尝试了以下步骤,但在运行phpinfo时找不到oci包: > 将文件解压缩为c中的一个文件,位于以下路径() 为oracle产品添加环境变量(path)的路径() 重新启动我的电脑 运行脚本() 6-删除;扩展前面=php_oci8

  • 我已经读了一些关于我的问题的帖子(比如这篇文章),但没有一篇能解决这个问题。在我的Flask应用程序中,我使用内置在多处理中的Python(在16个物理核心上)并行下载了32-64个图像,如下所示: 下载工作正常,除了内存使用外,速度显著提高。在下载过程中,Python分配了大约100GB的RAM,尽管实际只使用了大约2GB。每个进程分配超过6 gb的RAM,仅用于下载最多4个图像,每个图像的容量

  • 内存不足,Java运行时环境无法继续。 本机内存分配(mmap)无法映射1366294528字节以提交保留内存。包含更多信息的错误报告文件保存为://hs_err_pid5.log

  • 我在理解JVM进程如何分配自己的内存方面有一点差距。据我所知 其中堆外由线程堆栈、直接缓冲区、映射文件(库和JAR)和JVM代码本身组成; 目前,我正在尝试分析我的Java应用程序(Spring Boot Infinispan),RSS779M(它在docker容器中运行,所以pid 1是可以的): 换句话说,我想解释799M-(374M 89M)=316M堆外内存。 这些线程中的每一个都消耗1M