2014-05-15 23 views
0

我开发了一个内存泄漏压力的小型应用程序:中〜40M每获取引起的内存泄漏和应用程序内存溢出继续运行和分配

#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秒。我的系统内存是〜256M。

我检查由与顶部命令的应力应用所消耗的存储器:

$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%。

你能解释这种行为吗?

+0

http://en.cppreference.com/w/c/memory/malloc – juanchopanza

+0

@ Jarod42只是一个错字。在我的代码中是正确的。感谢您的信息 – MOHAMED

回答

5

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

另外请注意,许多现代的操作系统(如Linux)通常overcommit内存,由于你的代码实际上从未使用分配的内存,它也许可以做到这一点通过大量耗尽虚拟空间的前后迫使malloc()失败。这很可能就是为什么你看到你的程序使用的RAM比可用的更多。

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

+0

如何解释内存增长? – MOHAMED

+0

加上操作系统可能只是在硬盘上交换它。 – Theolodis

+0

我在malloc后添加了'if(buf == NULL)printf(“malloc return NULL \ n”);'在我的代码中。而且我从未收到打印的信息。请在我的问题中查看已更新的代码 – MOHAMED

0

当分配实际失败后尝试使用内存时,会发生崩溃。 (其他原因包括解引用野指针,尝试访问属于其他进程的内存等),但如果由于内存不可用导致分配失败,则单独不会导致崩溃。