我有一个C应用程序处理大量的数据(100 + KB)。 我正在使用malloc()
来分配所需的内存。
(char*)malloc(argLen + 18 + 2)
执行后,我可以释放分配的内存。
我明白,由于某些原因,free'd内存不会返回到操作系统。 我的问题是,当我再次运行程序,而不是重新使用分配的内存,它只是不断增加我的应用程序的内存使用情况。
编辑:我很抱歉的混乱。 这个过程是一个WebSocket服务。 除非故意停止,否则不会终止。 这是否意味着该进程将继续增加其内存使用量,并不会放开分配的内存,除非我手动重新启动它?
我明白,由于某些原因,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中的进程的等效工具。