前兩天發現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,使用10000次的迴圈向set中插入資料,同樣20s後使用clear函式清空set
結果:使用top檢視data列與 virt列,記憶體會漲到290m左右,clear後不會降下來。
第二種情況:將set定義以及資料的插入放在{}中,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 #include #include using namespace std;
void *mallocthread(void *argv)
sleep(20);
cout << "clear" << endl;
mset.clear(); }
} //delete p;
//sleep(20);
}int main(int argc, char *argv)
printf("aaaaaaaa\n");
i++;
sleep(2);
} sleep(200);
}
關於 WinScp 的一點使用經驗
在嵌入式平台下 是,使用ssh登陸,可以使用winscp提供的圖形介面,支援拖拽,滑鼠直接開啟,甚是好用。使用winscp 登陸的方式有,scp和sftp兩種,之前乙隻用scp,但後來出現了如下錯誤,登陸無法載入目錄 這種錯誤乙隻沒有解決。後來就是用了sftp。這需要把sftp server檔案 s...
關於iBatis selectKey的一點筆記
技術前提 我們使用ibatis作為持久層方案 技術場景 假設我們有兩張表,一張主表main,一張子表sub,並且主表的主鍵是由資料庫維護的自增長的主鍵,子表中有乙個字段引用這個主鍵,那麼當我們插入主表資料後,就需要馬上返回這個自增長的主鍵。解決方案 可以在insert時通過ibatis的select...
關於memset使用的一點小插曲
最近在工作中與客戶公司的開發人員進行開發交流時遇到了乙個簡單的小問題,覺得有必要記錄下來。memset buff,0x8000,300 300 將0x8000值寫入buff指向的記憶體中,即從buff的起始位址開始,依次填入300 300個0x8000。客戶公司的開發人員用這句 生成的程式沒有出現他...