当前位置: 首页 > 面试题库 >

使用malloc分配的内存超过现有内存

壤驷雅达
2023-03-14
问题内容

每次从stdin读取字母“ u”时,此代码段将分配2Gb,并且在读取“ a”后将初始化所有分配的字符。

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <vector>
#define bytes 2147483648
using namespace std;
int main()
{
    char input [1];
    vector<char *> activate;
    while(input[0] != 'q')
    {
        gets (input);
        if(input[0] == 'u')
        {
            char *m = (char*)malloc(bytes);
            if(m == NULL) cout << "cant allocate mem" << endl;
            else cout << "ok" << endl;
            activate.push_back(m);
        }
        else if(input[0] == 'a')
        {
            for(int x = 0; x < activate.size(); x++)
            {
                char *m;
                m = activate[x];
                for(unsigned x = 0; x < bytes; x++)
                {
                    m[x] = 'a';
                }
            }
        }
    }
    return 0;
}

我在具有3Gb内存的linux虚拟机上运行此代码。在使用htop工具监视系统资源使用情况时,我已经意识到malloc操作不会反映在资源上。

例如,当我仅输入一次“ u”(即分配2GB的堆内存)时,我看不到htop中的内存使用量增加2GB。只有当我输入“
a”(即初始化)时,我才会看到内存使用量增加。

结果,我能够“分配”更多的堆内存。例如,我可以malloc
6GB(比我的ram和swap内存大),而malloc会允许它(即malloc不返回NULL)。但是,当我尝试初始化分配的内存时,我可以看到内存和交换内存已满,直到进程被杀死为止。

-我的问题:

1.这是内核错误吗?

2.有人可以向我解释为什么允许这种行为吗?


问题答案:

这称为 内存过量使用 。您可以通过以超级用户身份运行来禁用它:

 echo 2 > /proc/sys/vm/overcommit_memory

而且它不是我喜欢的内核功能(因此我总是禁用它)。参见malloc(3)和mmap(2)和proc(5)

注意:echo 0不是echo 2 经常 -但不是总是-也可以。阅读文档(特别proc是我刚刚链接到的手册页)。



 类似资料:
  • 使用ResNet50预训练的权重我试图构建一个分类器。代码库完全在Keras高级Tensorflow API中实现。完整的代码发布在下面的GitHub链接中。 源代码:使用RestNet50架构进行分类 预训练模型的文件大小为94.7mb。 我加载了预先训练过的文件 并符合模型 在训练数据集中,我有两个文件夹狗和猫,每个文件夹持有近10,000张图像。当我编译脚本时,我得到以下错误 纪元1/1 2

  • 我正在尝试运行下面的程序,在该程序中,我使用一个名为Reserve的函数动态地为变量分配内存。当我运行应用程序时,由于在一个单独的函数中为一个空指针分配内存,我会得到分段错误,但是如果我想在主函数中分配内存,我不会得到这个错误。那我做错了什么? 代码如下:

  • 我使用Keras/Tensorflow在python中创建了一个程序。我对数据的创建和训练没有任何问题。但是,当我想评估我的模型时,我有以下错误: 这似乎是一个内存分配问题。我缩小了模型的尺寸,缩小了所有参数,但没有任何变化。我不知道如何解决这个问题。

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

  • 问题内容: 首先,我注意到当我分配内存与calloc时,内存占用量是不同的。我正在使用数GB的数据集。此数据可以是随机的。 我以为我可以分配大量的内存并读取其中的任何随机数据,然后将其强制转换为浮点数。但是,在进程查看器中查看内存占用量时,显然并没有要求使用内存(与calloc相比,我看到了较大的占用空间)。我运行了一个循环,将数据写入内存,然后看到内存占用量攀升。 我是否正确地说,直到初始化内存

  • 问题内容: 使用以下Java选项启动Apache Tomcat(Atlassian Confluence)实例: 但是,我看到启动后,它很快就耗尽了虚拟服务器上可用的1GB内存中的大部分。 总消耗的内存(堆+ PermGen)是否不应该保持在使用- Xmx指定的值以下?这引起的问题之一是我无法使用关闭脚本关闭服务器,因为它试图生成具有256MB内存的JVM,该JVM因不可用而失败。 问题答案: T