我为内存泄漏压力开发了一个小应用程序:
#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/