我们的一些内部开发的应用程序遇到了一个奇怪的问题,并认为它是代码中的深层内容,但后来我们编写了一个快速的示例来测试它,我们遇到了同样的问题。
以下是示例代码:
#include <stdio.h>
int main(void)
{
int i;
int j;
int COUNT = 750000;
double x[100];
double y[100];
FILE *OutputFile1;
FILE *OutputFile2;
FILE *OutputFile3;
FILE *OutputFile4;
FILE *OutputFile5;
FILE *OutputFile6;
FILE *OutputFile7;
FILE *OutputFile8;
FILE *OutputFile9;
OutputFile1 = fopen("Output_file_1.dat","w");
OutputFile2 = fopen("Output_file_2.dat","w");
OutputFile3 = fopen("Output_file_3.dat","w");
OutputFile4 = fopen("Output_file_4.dat","w");
OutputFile5 = fopen("Output_file_5.dat","w");
OutputFile6 = fopen("Output_file_6.dat","w");
OutputFile7 = fopen("Output_file_7.dat","w");
OutputFile8 = fopen("Output_file_8.dat","w");
OutputFile9 = fopen("Output_file_9.dat","w");
/* Do stuff in here */
/* Initialize the arrays */
for( i = 0; i < 100; i++)
{
x[i] = 2.50 * (double)i;
y[i] = 10.0 * (double)i;
}
printf("Initialized the x and y arrays\n");
/* Write junk to files */
for( i = 0; i < COUNT; i++)
{
printf("Outer loop %d\n", i);
for( j = 0; j < 100; j++)
{
fprintf(OutputFile1," %e", x[j]);
fprintf(OutputFile2," %e", x[j]);
fprintf(OutputFile3," %e", x[j]);
fprintf(OutputFile4," %e", x[j]);
fprintf(OutputFile5," %e", x[j]);
fprintf(OutputFile6," %e", y[j]);
fprintf(OutputFile7," %e", y[j]);
fprintf(OutputFile8," %e", y[j]);
fprintf(OutputFile9," %e", y[j]);
}
fprintf(OutputFile1,"\n");
fprintf(OutputFile2,"\n");
fprintf(OutputFile3,"\n");
fprintf(OutputFile4,"\n");
fprintf(OutputFile5,"\n");
fprintf(OutputFile6,"\n");
fprintf(OutputFile7,"\n");
fprintf(OutputFile8,"\n");
fprintf(OutputFile9,"\n");
}
/* End doing stuff here */
fflush(OutputFile1);
fclose(OutputFile1);
fflush(OutputFile2);
fclose(OutputFile2);
fflush(OutputFile3);
fclose(OutputFile3);
fflush(OutputFile4);
fclose(OutputFile4);
fflush(OutputFile5);
fclose(OutputFile5);
fflush(OutputFile6);
fclose(OutputFile6);
fflush(OutputFile7);
fclose(OutputFile7);
fflush(OutputFile8);
fclose(OutputFile8);
fflush(OutputFile9);
fclose(OutputFile9);
return(0);
}
所以,这就是你运行它时会发生什么。如果你在一个终端窗口中运行它并在它运行时在另一个终端窗口中运行顶部,你会注意到你的内存被吃掉了。它运行大约需要8分钟,完成后,系统不会返回内存,直到文件被删除。删除文件后,所有内存都将释放回系统。
它只是C与最新的gcc编译器,CentOs 6.3。
我们错过了什么吗?
谢谢!
答案 0 :(得分:0)
系统会缓存这些文件,以便下次快速访问。由于应用程序不使用内存,因此它用于缓存。如果文件消失或其他应用程序需要更多内存来运行,则释放缓存。
答案 1 :(得分:0)
“系统没有回复内存”。你怎么知道的? “top
”报告的“内存”和“可以使用的内存”之间存在差异。这是因为磁盘I / O尽可能存储在缓存中 - 这样,如果您需要再次使用相同的文件,则信息已在内存中可用 - 访问速度更快。删除文件后,保留缓存不再有用 - 因此清除缓存。
另一种看待这种情况的方法是使用free
命令。在我的Linux机器上执行此操作,我看到以下内容:
total used free shared buffers cached
Mem: 66005544 65559292 446252 0 199832 60332160
-/+ buffers/cache: 5027300 60978244
Swap: 1044216 1884 1042332
关键字是“-/+ buffers/cache
”。你可以看到第一行告诉我“446M免费” - 在64G机器上不是很多。但第二行说“只开玩笑,你有60 G免费”。那就是真正的“免费记忆”。
查看该行是否“回放内存”而不必删除文件。我想你会发现它。