我有一个处理大量数据(100+ KB)的C应用程序。
我正在使用malloc()
来分配所需的内存。
(char*)malloc(argLen + 18 + 2)
执行后,我使用free
释放分配的内存。
据我所知,由于某些原因,free'd内存不会返回给操作系统。我的问题是当我再次运行程序时,它不再重用已分配的内存,而是继续增加应用程序的内存使用量。
修改 我很抱歉这个混乱。该过程是WebSocket服务。除非故意停止,否则它不会终止。这是否意味着该进程将继续增加其内存使用量并且不会释放已分配的内存,除非我手动重新启动它?
答案 0 :(得分:3)
据我所知,由于某些原因,free'd内存不会返回给操作系统。
调用free
后内存会发生什么变化依赖于实现。您告诉操作系统您已完成它。它可能会也可能不会释放它。不释放它的一个原因是分配内存可能代价高昂,如果程序要求更多内存,操作系统可以再次返回相同的内存。
我的问题是当我再次运行程序时,它不再重用已分配的内存,而是继续增加应用程序的内存使用量。
不。一旦程序终止,它的所有已分配内存都将被释放。或者至少它应该。然而,人们可以说“这不属于你的业务”。
我做了一个简单的C程序。它没有任何错误检查,但您可以使用它来观察程序运行时的行为。用随机值填充数组的代码和用于打印它的代码只是为了确保没有任何东西得到优化。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int *ptr;
int size;
char c='a';
srand(time(NULL));
while(c!='q')
{
printf("a - allocate memory\n");
printf("f - free memory\n");
printf("p - print array\n");
printf("q - quit\n");
printf("Choose: ");
scanf(" %c", &c);
if(c=='q')
break;
else if(c=='a') {
printf("Size : ");
scanf(" %d", &size);
ptr=malloc(size * sizeof(*ptr));
for(int i=0; i<size; i++)
ptr[i]=rand();
}
else if (c=='f')
free(ptr);
else if(c=='p') {
for(int i=0; i<size; i++)
printf("%d", ptr[i]);
}
}
}
在使用它时,我正在使用top -p<PID>
观看该过程,它看起来像这样:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
28601 klutt 20 0 4172 692 616 S 0.0 0.0 0:00.00 a.out
当我分配和释放记忆时,它有时显示,有时不显示。如果我指定一个大尺寸,它会更频繁地产生影响。是的,我知道您指定了Windows并且我使用了Linux命令,但我很确定您可以找到用于分析Windows中进程的等效工具。