關於Linux STL使用的一點總結

來源:互聯網
上載者:User

前兩天發現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);}


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.