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之間及其不平衡,加上苛刻的內存歸還條件,在整個程序運行過程中,占用內存幾乎從未下降過,區別僅僅是緩慢上漲和快速上漲。