【发布时间】:2014-04-14 21:44:57
【问题描述】:
我正在开发一个使用大量但有限内存的程序。内存在不同线程的运行时分配和释放。但是,我注意到程序的内存使用量不会保持在指定范围内。随着时间的推移,它会增加。我编写了以下示例程序来检查内存是否被释放回操作系统。已释放一半分配的内存以检查内存使用情况是否下降。
int main()
{
char *p[COUNT];
for(int i = 0; i < COUNT; i++)
{
p[i] = new char[1048576];
memset (p[i], 0, 1048576);
printf("%p\n", p[i]);
}
printf("done allocating ... \n");
sleep(10);
printf("Freeing\n");
for(int i; i < COUNT; i++)
{
delete[] p[i];
}
while(1)
sleep(1);
}
运行程序后,操作系统似乎不会回收释放的页面。在分配和释放之后,内存使用情况与 linux 中的“top”命令中看到的相同。它只是将页面标记为免费,以供同一程序重用。 在我的程序中,malloc 和 free 运行在不同的线程上。当 malloc 比 free 更频繁地调用并且进程数据段增长非常大时,这会导致内存管理问题,导致操作系统将页面交换到磁盘。这使程序和操作系统变得缓慢且无响应。操作系统有没有办法回收释放的内存?
【问题讨论】:
-
分配 2000 与解除分配 1000 ???
-
你错了。保留虚拟内存不会使程序或操作系统变慢且无响应。操作系统确实回收释放的物理内存。回收虚拟内存毫无意义,因为它不是稀缺资源。
-
@Dieter Lucking,只释放一半分配的内存,看看内存使用率是否下降
-
“但这次释放所有内存”是什么意思?根本不清楚你在做什么。 (另外,在第二个
for循环之前,您的代码永远不会将i设置回 0。) -
你肯定有内存管理问题——那个程序根本不会释放任何内存。
标签: c++ linux memory-management malloc free