- 主题:问一个container内存释放的问题
外行救助。
container分配的内存如何才能彻底释放?
测试了很多办法,vector,set,map一类的container,不论是clear,erase,还是swap,
delete都不会将内存返回系统。
查资料说这样优化是为了速度更快,因为每次分配内存再释放内存很慢。
但是如果这样,碰巧建了一个超大的临时map,内存就是被一直占着。清空后下次再用的时候,确实内存不会增加,但是也不减少,就这么一直占着。
请问如何才能将内存返回给OS?
C++11. OS Ubuntu 18.
代码大概是这个样子
class C {
vector<int> a;
vector<int> *b;
C(){
b= new vector<int>();
for (int i=0;i<10000000000;i++){
a.push_back(i);
b->push_back(i);
}
}
~C(){
vector<int>().swap(a);
delete b;
}
};
main(){
//check memory here
for (int i=0;i<10;i++){
C *c = new C();
delete c;
}
//check memory here
}
--
FROM 159.226.67.*
那这个怎么解决?
【 在 pgw (pppppppgw) 的大作中提到: 】
: 又不是容器的问题,是malloc库的问题
--
FROM 159.226.67.*
测试一下
就是指针不指针都不能返还内存给系统
【 在 one4all4one (one4all4one) 的大作中提到: 】
: 不过你vector<int> *b; 是为什么啊?直接vector不行吗?一定要指针?
--
FROM 159.226.67.*
不行
【 在 Tyo (T3|等待原来苍老了你我|彻底沦为IT民工) 的大作中提到: 】
: 析构不就完了
--
FROM 159.226.67.*
加一个sleep然后观察top
【 在 fanci (大葡萄) 的大作中提到: 】
: //check memory here 是咋check
--
FROM 159.226.67.*
这个significantly larger怎么理解?我每次增加的不多,但是次数很频繁。导致系统内存经常吃紧,然后也不会释放出来。
【 在 mvtec (mvtec) 的大作中提到: 】
: Generally, the heap is not shrunk after each free. Instead, the malloc() implementation keeps freed memory around for a subsequent allocation. Only when the size of the heap is significantly larger than the amount of allocated memory does malloc() s
: Consequently, for large allocations, glibc does not use the heap. Instead, glibc creates an anonymous memory mapping to satisfy the allocation request.
--
FROM 159.226.67.*
赞美你
我在析构里面加不能“立即”释放,放在delete c后面就可以。
【 在 jackhu123 (cpp程序员) 的大作中提到: 】
: 我也不是很懂,
: 在centos上验证了一下,std::vector可以直接“释放内存”(交还操作系统),std::map重现了
: 解决方法:在destructor增加调用"malloc_trim(0);"
: ...................
--
FROM 159.226.67.*
这个问题困扰了我好多天了。
因为程序有些复杂,是嵌套了三层结构的map<int, map<int, vector<int>> a; 这种。
开始犯的错误是参数传递的时候没有形参,导致每次都复制一份,内存使用飙升。然后以为没有释放干净,用Valgrind查不出问题。
后来改了形参内存不飙升了,但是不释放也很头疼。
前面有人提出我为什么用vector<int> *a。也是为了测试主动delete a有没有效果,结果一样无效。
我的程序是反复做一个大型的模拟,因为有随机变量在里面,每次模拟所需要的内存从几M到几十G不等,要做几万个模拟,需要几个进程同时跑来加速,进程之间靠log文件来判断模拟是否已经跑完。
结果就是跑10个进程,开始的时候大家都占了几百兆的内存,很和谐。然后忽然某个进程占了10G内存不释放(其实只有极少数的模拟会这样),系统内存吃紧,再后来就是大家都占10几G内存,机器就崩了。
我测试了各种方案,包括delete,swap,erase+shrink_to_fit,完全无效。就差自己实现map了。
你这一个函数直接解决了我大问题,看来我获取知识的能力还有欠缺。
【 在 jackhu123 (cpp程序员) 的大作中提到: 】
: 赞反馈,
: 互相学习
--
FROM 159.226.67.*
不用析构,但是在linux下会hold住这部分内存不返还给操作系统,为的是下次使用的时候速度快一些。
除了malloc_trim(0),还不知道用什么方法可以优雅的把内存返还给OS
【 在 one4all4one (one4all4one) 的大作中提到: 】
: 不是指针你就不用析构了吧?会自动的析构,程序结束就释放内存了。除非你vector里面是自己的类,需要对那个类析构
--
FROM 159.226.67.*
shrink_to_fit也试过了,不返还。
另外map不提供这个方法
【 在 one4all4one (one4all4one) 的大作中提到: 】
: One technique that is commonly used is to swap the vector you want to empty out with a new and completely empty vector, like this:
: // suppose the type of your vectors is vector<int>
: vector<int>().swap (myvec[i]);
: ...................
--
FROM 159.226.67.*