tcmalloc相关内存未释放

https://blog.csdn.net/lantianjialiang/article/details/50510937

https://www.cnblogs.com/scotth/p/4285480.html

tcmalloc内存未释放可做一下几个操作

解决方法:

1. 不使用cache,将用-DSMALL_BUT_SLOW 将tcmalloc从新编译一遍;

2. 检查自己的代码,看看那些地方的连续内存,只释放了一部分。

3.调用tcmalloc接口,立刻释放

glibc内存释放逻辑

1. glibc在多线程内存分配的场景下为了减少lock contention,会new出很多arena出来,每个线程都有自己默认的arena,但是内存申请时如果默认arena被占用,则round-robin到下一个arena。

2. 每个arena的空间不可直接共享和互相借用,除非通过主arena释放给操作系统然后被各个辅助arena重新申请。

3. glibc归还内存给OS有一个很苛刻的条件就是top chunk必须是free的,否则,即使应用程序已经释放了大片内存,glibc也不会将这些内存归还给OS。

在我们的场景中常常是thread A alloc一片空间,最后由thread B free,所以这就造成各个arena之间及其不平衡,加上苛刻的内存归还条件,在整个程序运行过程中,占用内存几乎从未下降过,区别仅仅是缓慢上涨和快速上涨。

posted @ 2020-12-02 23:39  大老虎打老虎  阅读(1114)  评论(0编辑  收藏  举报