前兩天發現Linux使用STL的程式記憶體佔用比較大,通過valgrind檢查沒有發現記憶體泄露,分析可能與STL有關,所以單獨對STL進行測試
程式建立10個線程,採用分離方式,每隔2秒建立一個線程。
1.對new 與 delete的測試
在每個線程中new 很大一塊記憶體,然後間隔20s後delete
使用top查看DATA列與 VIRT列,發現記憶體一開始上漲到200多M,然後慢慢地隨著delete記憶體降下來,最終穩定在100M,由於自己系統每個線程預設線程棧10M,所以此時個人認為正常。當然測試過不釋放記憶體的情況,記憶體確實無法降下來。
2.linux STL的測試
第一種情況:還是10個線程,每個線程定義一個set<string>,使用10000次的迴圈向set中插入資料,同樣20s後使用clear函數清空set
結果:使用top查看DATA列與 VIRT列,記憶體會漲到290M左右,clear後不會降下來。
第二種情況:將set<string>定義以及資料的插入放在{}中,clear後,然後重新定義set,插入同樣的資料,發現記憶體不會再增加,固定在290M。
總結:
STL 中的set即使銷毀了,記憶體也不會釋放,而是等待下次重新使用。具體STL中的實現還有待於閱讀STL源碼。
問題:
1.如果不停插入資料,記憶體釋放會耗盡呢?
2.如果set只使用一次後就不再重複使用了,記憶體什麼時候釋放呢?
3.linux 有cache技術,cache作為空白閑記憶體一部分,但是發現一種情況就是cache比較大,通過cat /proc/buddyinfo 查看記憶體片段結果如下:
HighMem基本沒有剩餘,而Normal在被佔用,此時cache為1G多,不明白為什麼產生這種情況,查看記憶體佔用也不是很大(使用top 與ps -aux分別查看)。
以上是自己在使用過程中的一點拙見,存在理解錯誤的地方請大家指正,同時也希望大俠對後面的問題給予解惑。
測試代碼如下:
#include <iostream>#include <stdlib.h>#include <set>using namespace std;void *mallocThread(void *argv){//char *p = new char[10000000];{set<string> mSet;for (int i = 0 ; i < 100000; i++){char buf[10];sprintf(buf,"%d",i);string temp = buf;temp += "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";mSet.insert(temp);}sleep(20);cout << "clear" << endl;mSet.clear();}{set<string> mSet;for (int i = 0 ; i < 100000; i++){char buf[10]; sprintf(buf,"%d",i); string temp = buf; temp += "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";mSet.insert(temp);}}//delete []p;//sleep(20);}int main(int argc, char *argv[]){int i = 0 ;while (i < 10){pthread_t tid;int temp = pthread_create(&tid, NULL,mallocThread,NULL);if(temp == 0){pthread_detach(tid);}printf("AAAAAAAA\n");i++;sleep(2);}sleep(200);}