当前位置: 技术问答>linux和unix
LINUX系统某一目录当写入2万个文件后内存发生泄漏!附源代码
来源: 互联网 发布时间:2016-03-05
本文导语: LINUX系统某一目录当写入2万个文件后内存发生泄漏!附源代码 //g++ -o mem mem.cpp #include #include //获取内存信息 bool getmeminfo(double * total,double * used ,double * free) { struct sysinfo info; sysinfo(&info); *total = (double)in...
LINUX系统某一目录当写入2万个文件后内存发生泄漏!附源代码
//g++ -o mem mem.cpp
#include
#include
//获取内存信息
bool getmeminfo(double * total,double * used ,double * free)
{
struct sysinfo info;
sysinfo(&info);
*total = (double)info.totalram/(1024.0*1024.0);
*used = (double)(info.totalram-info.freeram)/(1024.0*1024.0);
*free = (double)info.freeram/(1024.0*1024.0);
return true;
}
int main()
{
unsigned char * pbuffer = new unsigned char[1024*1024*3];
double total = 0.0;
double used = 0.0;
double free = 0.0;
long id = 0;
char strfile[256];
while(1)
{
FILE * fp;
sprintf(strfile,"/data/%ld",id++);
if ((fp=fopen(strfile,"w")) ==NULL)
{
return false;
}
fwrite(pbuffer,1,1024*1024*3,fp);
fclose(fp);
getmeminfo(&total,&used,&free);
printf(" used=%0.3f id == %dn", used, id);// 打印内存信息,发现当id > 20000的时候出现内存增长
remove(strfile);
}
delete pbuffer;
return 0;
}
//g++ -o mem mem.cpp
#include
#include
//获取内存信息
bool getmeminfo(double * total,double * used ,double * free)
{
struct sysinfo info;
sysinfo(&info);
*total = (double)info.totalram/(1024.0*1024.0);
*used = (double)(info.totalram-info.freeram)/(1024.0*1024.0);
*free = (double)info.freeram/(1024.0*1024.0);
return true;
}
int main()
{
unsigned char * pbuffer = new unsigned char[1024*1024*3];
double total = 0.0;
double used = 0.0;
double free = 0.0;
long id = 0;
char strfile[256];
while(1)
{
FILE * fp;
sprintf(strfile,"/data/%ld",id++);
if ((fp=fopen(strfile,"w")) ==NULL)
{
return false;
}
fwrite(pbuffer,1,1024*1024*3,fp);
fclose(fp);
getmeminfo(&total,&used,&free);
printf(" used=%0.3f id == %dn", used, id);// 打印内存信息,发现当id > 20000的时候出现内存增长
remove(strfile);
}
delete pbuffer;
return 0;
}
|
楼主所谓的内存泄漏应该是很小的吧。这可能是因为系统回收内存的问题。有的系统回收内存是检测到一定长度并且连续的内存均未使用才将其回收。若没到达该长度就算有释放的内存系统也不会立即回收。
|
不明白 cceczjxy 方法的意图,
不知道内存涨到100%后会发生什么情况?
---------------------------
如果是程序内存泄漏,那起多个进程会使内存泄漏的速度成倍增加。
但在测试中没有出现这样的情况。说明应该不是程序的原因。
再着,你测试过程中要尽量把其他程序关掉,才能更准确的体现结果。因为你显示的是整个系统的信息。
系统的内存管理进程保证了内存使用不会达到100%,在内核线程kswapd和pdflush中,在内存分配时和定时监控内存的使用情况,如果空闲内存页面小于某个值(默认5%,这个值在编译内核时可以修改的),会释放一些内存页面的。
不知道内存涨到100%后会发生什么情况?
---------------------------
如果是程序内存泄漏,那起多个进程会使内存泄漏的速度成倍增加。
但在测试中没有出现这样的情况。说明应该不是程序的原因。
再着,你测试过程中要尽量把其他程序关掉,才能更准确的体现结果。因为你显示的是整个系统的信息。
系统的内存管理进程保证了内存使用不会达到100%,在内核线程kswapd和pdflush中,在内存分配时和定时监控内存的使用情况,如果空闲内存页面小于某个值(默认5%,这个值在编译内核时可以修改的),会释放一些内存页面的。