【发布时间】:2014-06-22 23:28:17
【问题描述】:
我正在处理常驻内存增加问题。 为了模拟我写了一个代码sn-p,它实际上是在模拟我的问题。
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <malloc.h>
using namespace std;
int main()
{
int count = 0;
char szCmd[128];
system("> result_top.txt");
while (count < 10)
{
sprintf(szCmd, "echo \"\nRound %d\n\" >> result_top.txt", count);
system(szCmd);
system("top -b -n 1 -p `pgrep a.out` | tail -4 >> result_top.txt");
int **t = new int*[100000];
for(long i = 0; i < 100000; i++)
{
t[i] = new int();
}
system("top -b -n 1 -p `pgrep a.out`| tail -4 >> result_top.txt");
for(long i = 100000 - 1; i >= 0; i--)
{
delete t[i];
}
delete [] t;
sleep(5);
system("top -b -n 1 -p `pgrep a.out`| tail -4 >> result_top.txt");
printf("round %d finished\n", count);
count++;
}
return 0;
}
现在我在每一轮之后记录常驻内存并将其重定向到文件 result_top.txt 中。 这是文件 result_top.txt 中的 o/p
Round 0
/* Before Allocation RES */
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11053 root 20 0 11736 852 724 S 0.0 0.0 0:00.00 a.out
/* After allocation RES */
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11053 root 20 0 15688 4808 768 S 0.0 0.2 0:00.01 a.out
/* After Deletion RES*/
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11053 root 20 0 14904 4028 772 S 0.0 0.2 0:00.02 a.out
Round 1
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11053 root 20 0 14908 4048 788 S 0.0 0.2 0:00.02 a.out
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11053 root 20 0 15700 4828 788 S 0.0 0.2 0:00.05 a.out
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11053 root 20 0 11872 1052 788 S 0.0 0.0 0:00.06 a.out
Round 2
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11053 root 20 0 11872 1052 788 S 0.0 0.0 0:00.06 a.out
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11053 root 20 0 15688 4828 788 S 0.0 0.2 0:00.08 a.out
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11053 root 20 0 11872 1052 788 S 0.0 0.0 0:00.09 a.out
Round 3
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11053 root 20 0 11872 1052 788 S 0.0 0.0 0:00.09 a.out
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11053 root 20 0 15688 4828 788 S 0.0 0.2 0:00.11 a.out
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11053 root 20 0 11872 1052 788 S 0.0 0.0 0:00.13 a.out
现在在第 0 轮中,当我释放内存时,驻留内存为 4028,而在分配内存之前的第二次迭代中,它变为 4048。
增加了 20 个字节
在第一轮之后,每一轮一切都很好。那么这 20 字节增加的原因是什么?
类似的情况也发生在我的项目代码中。
【问题讨论】:
-
我建议使用外部工具来查看进程的内存消耗。在顶部测量之间,例如你打电话给 printf/sprintf/system 谁知道他们在内部做什么。还要记住,在 malloc 实现决定这样做之前,RES 可能不会减少。只是调用 delete() 并不意味着 RES 会下降。对于工具,我建议使用 valgrind 的地块或类似的东西:milianw.de/code-snippets/tracking-memory-consumption-using-pmap欢呼
标签: c++ memory-management memory-leaks operating-system