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

MOH*_*MED 0 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;
}
Run Code Online (Sandbox Code Playgroud)

应用程序每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
Run Code Online (Sandbox Code Playgroud)

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

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

28308 5682 root S 2022m 818% 0% ./stress_test
Run Code Online (Sandbox Code Playgroud)

我希望我的应用程序在达到100%时停止分配.

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

unw*_*ind 5

你为什么期望它"崩溃"?如果分配失败,malloc()只需返回NULL.

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

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