c++ - 获取内存泄漏导致的内存溢出,应用程序继续运行和分配

标签 c++ c linux memory memory-management

我为内存泄漏压力开发了一个小应用程序:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    int period = 0;
    int size = 40000001;
    char *buf = NULL;
    if (argc > 1) period = atoi(argv[1]);
    if (period == 0) period = 21;

    for (;;) {
        buf = malloc(size);
        if (buf == NULL) printf ("malloc return NULL\n");
        sleep(period);
    }
    return 0;
}

应用程序每 20 秒分配 ~40M 的内存(没有空闲)。我的系统内存是~256M。

我用top命令查看了压力应用消耗的内存:

$top | grep "stress"
  873  5689 root     S    39892  16%   0% ./stress_test
  873  5689 root     S    39892  16%   0% ./stress_test
  873  5689 root     S    39892  16%   0% ./stress_test
  873  5689 root     S    78956  31%   0% ./stress_test
  873  5689 root     S    78956  31%   0% ./stress_test
  873  5689 root     S    78956  31%   0% ./stress_test
  873  5689 root     S    78956  31%   0% ./stress_test
  873  5689 root     S    78956  31%   0% ./stress_test
  873  5689 root     S     115m  47%   0% ./stress_test
  873  5689 root     S     115m  47%   0% ./stress_test
  873  5689 root     S     115m  47%   0% ./stress_test
  873  5689 root     S     115m  47%   0% ./stress_test
  873  5689 root     S     153m  62%   0% ./stress_test
  873  5689 root     S     153m  62%   0% ./stress_test
  873  5689 root     S     153m  62%   0% ./stress_test
 1061  5689 root     S     1564   1%   0% grep stress
  873  5689 root     S     153m  62%   0% ./stress_test
  873  5689 root     S     191m  77%   0% ./stress_test
  873  5689 root     S     191m  77%   0% ./stress_test
  873  5689 root     S     191m  77%   0% ./stress_test
  873  5689 root     S     191m  77%   0% ./stress_test
  873  5689 root     S     229m  93%   0% ./stress_test
  873  5689 root     S     229m  93%   0% ./stress_test
  873  5689 root     S     229m  93%   0% ./stress_test
  873  5689 root     S     229m  93%   0% ./stress_test
  873  5689 root     S     267m 108%   0% ./stress_test
  873  5689 root     S     267m 108%   0% ./stress_test
  873  5689 root     S     267m 108%   0% ./stress_test
  873  5689 root     S     267m 108%   0% ./stress_test
  873  5689 root     S     305m 124%   0% ./stress_test
  873  5689 root     S     305m 124%   0% ./stress_test
  873  5689 root     S     305m 124%   0% ./stress_test
  873  5689 root     S     305m 124%   0% ./stress_test
  873  5689 root     S     305m 124%   0% ./stress_test
  873  5689 root     S     344m 139%   0% ./stress_test
  873  5689 root     S     344m 139%   0% ./stress_test
  873  5689 root     S     344m 139%   0% ./stress_test
  873  5689 root     S     344m 139%   0% ./stress_test
  873  5689 root     S     382m 155%   0% ./stress_test
  873  5689 root     S     382m 155%   0% ./stress_test
 1061  5689 root     S     1564   1%   0% grep stress
  873  5689 root     S     382m 155%   0% ./stress_test
  873  5689 root     S     382m 155%   0% ./stress_test
  873  5689 root     S     420m 170%   0% ./stress_test
  873  5689 root     S     420m 170%   0% ./stress_test
  873  5689 root     S     420m 170%   0% ./stress_test
  873  5689 root     S     458m 185%   0% ./stress_test
  873  5689 root     S     458m 185%   0% ./stress_test
  873  5689 root     S     458m 185%   0% ./stress_test
  873  5689 root     S     458m 185%   0% ./stress_test
  873  5689 root     S     496m 201%   0% ./stress_test
  873  5689 root     S     496m 201%   0% ./stress_test
  873  5689 root     S     496m 201%   0% ./stress_test
  873  5689 root     S     496m 201%   0% ./stress_test
  873  5689 root     S     534m 216%   0% ./stress_test
  873  5689 root     S     534m 216%   0% ./stress_test
  873  5689 root     S     534m 216%   0% ./stress_test
  873  5689 root     S     534m 216%   0% ./stress_test
  873  5689 root     S     534m 216%   0% ./stress_test
  873  5689 root     S     573m 232%   0% ./stress_test
  873  5689 root     S     573m 232%   0% ./stress_test
  873  5689 root     S     573m 232%   0% ./stress_test
 1061  5689 root     S     1564   1%   0% grep stress
  873  5689 root     S     573m 232%   0% ./stress_test
  873  5689 root     S     611m 247%   0% ./stress_test
  873  5689 root     S     611m 247%   0% ./stress_test
  873  5689 root     S     611m 247%   0% ./stress_test
  873  5689 root     S     611m 247%   0% ./stress_test
  873  5689 root     S     649m 263%   0% ./stress_test
  873  5689 root     S     649m 263%   0% ./stress_test
  873  5689 root     S     649m 263%   0% ./stress_test
  873  5689 root     S     649m 263%   0% ./stress_test
  873  5689 root     S     687m 278%   0% ./stress_test
  873  5689 root     S     687m 278%   0% ./stress_test
  873  5689 root     S     687m 278%   0% ./stress_test
  873  5689 root     S     687m 278%   0% ./stress_test
  873  5689 root     S     725m 293%   0% ./stress_test
  873  5689 root     S     725m 293%   0% ./stress_test
  873  5689 root     S     725m 293%   0% ./stress_test
  873  5689 root     S     725m 293%   0% ./stress_test
  873  5689 root     S     763m 309%   0% ./stress_test
  873  5689 root     S     763m 309%   0% ./stress_test
  873  5689 root     S     763m 309%   0% ./stress_test
  873  5689 root     S     763m 309%   0% ./stress_test
  873  5689 root     S     763m 309%   0% ./stress_test
  873  5689 root     S     801m 324%   0% ./stress_test
  873  5689 root     S     801m 324%   0% ./stress_test
  873  5689 root     S     801m 324%   0% ./stress_test
  873  5689 root     S     801m 324%   0% ./stress_test
  873  5689 root     S     840m 340%   0% ./stress_test
  873  5689 root     S     840m 340%   0% ./stress_test
 1061  5689 root     S     1564   1%   0% grep stress
  873  5689 root     S     840m 340%   0% ./stress_test
 1061  5689 root     S     1564   1%   0% grep stress
  873  5689 root     S     840m 340%   0% ./stress_test
Mem: 120004K used, 132592K free, 0K shrd, 0K buff, 30076K cached
  873  5689 root     S     878m 355%   0% ./stress_test
  873  5689 root     S     878m 355%   0% ./stress_test
  873  5689 root     S     878m 355%   0% ./stress_test
  873  5689 root     S     878m 355%   0% ./stress_test
  873  5689 root     S     916m 370%   0% ./stress_test
  873  5689 root     S     916m 370%   0% ./stress_test
  873  5689 root     S     916m 370%   0% ./stress_test
  873  5689 root     S     916m 370%   0% ./stress_test
  873  5689 root     S     954m 386%   0% ./stress_test
  873  5689 root     S     954m 386%   0% ./stress_test
  873  5689 root     S     954m 386%   0% ./stress_test
  873  5689 root     S     954m 386%   0% ./stress_test
 1061  5689 root     S     1564   1%   0% grep stress
  873  5689 root     S     992m 401%   0% ./stress_test
  873  5689 root     S     992m 401%   0% ./stress_test
  873  5689 root     S     992m 401%   0% ./stress_test
  873  5689 root     S     992m 401%   0% ./stress_test
  873  5689 root     S     992m 401%   0% ./stress_test
  873  5689 root     S    1030m 417%   0% ./stress_test
  873  5689 root     S    1030m 417%   0% ./stress_test
  873  5689 root     S    1030m 417%   0% ./stress_test
  873  5689 root     S    1030m 417%   0% ./stress_test
  873  5689 root     S    1068m 432%   0% ./stress_test
  873  5689 root     S    1068m 432%   0% ./stress_test
  873  5689 root     S    1068m 432%   0% ./stress_test
  873  5689 root     S    1068m 432%   0% ./stress_test
  873  5689 root     S    1107m 448%   0% ./stress_test
  873  5689 root     S    1107m 448%   0% ./stress_test
  873  5689 root     S    1107m 448%   0% ./stress_test
  873  5689 root     S    1107m 448%   0% ./stress_test
  873  5689 root     S    1145m 463%   0% ./stress_test
  873  5689 root     S    1145m 463%   0% ./stress_test
  873  5689 root     S    1145m 463%   0% ./stress_test
  873  5689 root     S    1145m 463%   0% ./stress_test
  873  5689 root     S    1183m 478%   0% ./stress_test
  873  5689 root     S    1183m 478%   0% ./stress_test
  873  5689 root     S    1183m 478%   0% ./stress_test
  873  5689 root     S    1183m 478%   0% ./stress_test
  873  5689 root     S    1221m 494%   0% ./stress_test
  873  5689 root     S    1221m 494%   0% ./stress_test
  873  5689 root     S    1221m 494%   0% ./stress_test
  873  5689 root     S    1221m 494%   0% ./stress_test
 1061  5689 root     S     1564   1%   0% grep stress
  873  5689 root     S    1221m 494%   0% ./stress_test
  873  5689 root     S    1259m 509%   0% ./stress_test
  873  5689 root     S    1259m 509%   0% ./stress_test
  873  5689 root     S    1259m 509%   0% ./stress_test
 1061  5689 root     S     1564   1%   0% grep stress
  873  5689 root     S    1259m 509%   0% ./stress_test
  873  5689 root     S    1297m 525%   0% ./stress_test
  873  5689 root     S    1297m 525%   0% ./stress_test
  873  5689 root     S    1297m 525%   0% ./stress_test
  873  5689 root     S    1297m 525%   0% ./stress_test
  873  5689 root     S    1336m 540%   0% ./stress_test
  873  5689 root     S    1336m 540%   0% ./stress_test
  873  5689 root     S    1336m 540%   0% ./stress_test
  873  5689 root     S    1336m 540%   0% ./stress_test
  873  5689 root     S    1374m 556%   0% ./stress_test
  873  5689 root     S    1374m 556%   0% ./stress_test
  873  5689 root     S    1374m 556%   0% ./stress_test
  873  5689 root     S    1374m 556%   0% ./stress_test
  873  5689 root     S    1412m 571%   0% ./stress_test
  873  5689 root     S    1412m 571%   0% ./stress_test
  873  5689 root     S    1412m 571%   0% ./stress_test
  873  5689 root     S    1412m 571%   0% ./stress_test
  873  5689 root     S    1450m 586%   0% ./stress_test
  873  5689 root     S    1450m 586%   0% ./stress_test
  873  5689 root     S    1450m 586%   0% ./stress_test
  873  5689 root     S    1450m 586%   0% ./stress_test
  873  5689 root     S    1450m 586%   0% ./stress_test
  873  5689 root     S    1488m 602%   0% ./stress_test
 1061  5689 root     S     1564   1%   0% grep stress
  873  5689 root     S    1488m 602%   0% ./stress_test
  873  5689 root     S    1488m 602%   0% ./stress_test
  873  5689 root     S    1488m 602%   0% ./stress_test
  873  5689 root     S    1526m 617%   0% ./stress_test
  873  5689 root     S    1526m 617%   0% ./stress_test
  873  5689 root     S    1526m 617%   0% ./stress_test
  873  5689 root     S    1526m 617%   0% ./stress_test
  873  5689 root     S    1564m 633%   0% ./stress_test
  873  5689 root     S    1564m 633%   0% ./stress_test
  873  5689 root     S    1564m 633%   0% ./stress_test
  873  5689 root     S    1564m 633%   0% ./stress_test
  873  5689 root     S    1603m 648%   0% ./stress_test
  873  5689 root     S    1603m 648%   0% ./stress_test
  873  5689 root     S    1603m 648%   0% ./stress_test
  873  5689 root     S    1603m 648%   0% ./stress_test
  873  5689 root     S    1641m 664%   0% ./stress_test
  873  5689 root     S    1641m 664%   0% ./stress_test
 1061  5689 root     S     1564   1%   0% grep stress
  873  5689 root     S    1641m 664%   0% ./stress_test
  873  5689 root     S    1641m 664%   0% ./stress_test
  873  5689 root     S    1679m 679%   0% ./stress_test
  873  5689 root     S    1679m 679%   0% ./stress_test
  873  5689 root     S    1679m 679%   0% ./stress_test
  873  5689 root     S    1679m 679%   0% ./stress_test
  873  5689 root     S    1679m 679%   0% ./stress_test
  873  5689 root     S    1717m 694%   0% ./stress_test
  873  5689 root     S    1717m 694%   0% ./stress_test
  873  5689 root     S    1717m 694%   0% ./stress_test
  873  5689 root     S    1717m 694%   0% ./stress_test
  873  5689 root     S    1755m 710%   0% ./stress_test
  873  5689 root     S    1755m 710%   0% ./stress_test
  873  5689 root     S    1755m 710%   0% ./stress_test
  873  5689 root     S    1755m 710%   0% ./stress_test
  873  5689 root     S    1793m 725%   0% ./stress_test
  873  5689 root     S    1793m 725%   0% ./stress_test
  873  5689 root     S    1793m 725%   0% ./stress_test
  873  5689 root     S    1793m 725%   0% ./stress_test
  873  5689 root     S    1831m 741%   0% ./stress_test
  873  5689 root     S    1831m 741%   0% ./stress_test
  873  5689 root     S    1831m 741%   0% ./stress_test
  873  5689 root     S    1831m 741%   0% ./stress_test
 1061  5689 root     S     1564   1%   0% grep stress
  873  5689 root     S    1870m 756%   0% ./stress_test
  873  5689 root     S    1870m 756%   0% ./stress_test
 1061  5689 root     S     1564   1%   0% grep stress
  873  5689 root     S    1870m 756%   0% ./stress_test
  873  5689 root     S    1870m 756%   0% ./stress_test
  873  5689 root     S    1870m 756%   0% ./stress_test
  873  5689 root     S    1908m 771%   0% ./stress_test
  873  5689 root     S    1908m 771%   0% ./stress_test
  873  5689 root     S    1908m 771%   0% ./stress_test
  873  5689 root     S    1908m 771%   0% ./stress_test
  873  5689 root     S    1946m 787%   0% ./stress_test
  873  5689 root     S    1946m 787%   0% ./stress_test
  873  5689 root     S    1946m 787%   0% ./stress_test
  873  5689 root     S    1946m 787%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
 1061  5689 root     S     1564   1%   0% grep stress
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test
  873  5689 root     S    1984m 802%   0% ./stress_test

第四列是应用消耗的内存,第五列是应用消耗的内存百分比

因此压力应用程序在内存使用中增长并达到大于内存大小的值:1984M(内存的 802%)并且当消耗的内存 > 100% 时应用程序继续运行和分配。但是当它到达时它停止分配并继续运行

28308 5682 root S 2022m 818% 0% ./stress_test

我预计我的应用程序会在达到 100% 时停止分配。

你能解释一下这种行为吗?

最佳答案

为什么您认为它会“崩溃”?如果分配失败,malloc() 只会返回 NULL

另请注意,许多现代操作系统(如 Linux)通常为 overcommit内存,并且由于您的代码实际上从未使用分配的内存,因此它可能会在用完虚拟空间并强制 malloc() 失败之前大量使用.这可能就是您看到程序使用的 RAM 多于可用内存的原因。

当然,您没有说明您有多少交换空间,这也会影响发生的事情,因为即使您的特定操作系统没有过度使用,它也很可能使用交换空间。

关于c++ - 获取内存泄漏导致的内存溢出,应用程序继续运行和分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23674611/

相关文章:

C++ 模板类型定义

java - 如何从 Java 编写的文件中读取 C 语言的数据(二进制或文本)?

java - 为什么我的 java 文件没有运行 (bash)

c++ - 如何使用 ofstream 打开文件以便其他用户可以追加/写入同一文件?

linux - 将 printk 发送到串口

c++ - 融合多个 Haar 分类器进行人脸检测

c++ - OpenCV GTK+2.x 错误 - "Unspecified error (The function is not implemented...)"

c++ - OpenCV 训练 : Mergevec error: Input file does not exist or not readable

c - 在Linux中重置忽略信号的掩码

c++ - 为什么函数指针定义可以与任意数量的 & 符号 '&' 或星号 '*' 一起使用?