近期一個應用程序出現32k/4~5s的內存持續泄露。
排查思路:
-
在從業務鏈路上,從上游到下游,梳理數據流通路。
在其數據收發的幾個類的幾個方法上,通過函數重寫,添加hack函數(不做業務處理),分段查看泄露情況。 -
在proc目錄下,查看進程的mappings信息。統計當中{heap},{stack},發現{heap}是有緩慢增加的;其他段是維持固定的。
-
通過其他demo應用,進行交叉測試,發現demo沒有泄露。驗證了依賴的三方庫,通信庫,沒有泄露。
-
整個工程當中搜索 new, malloc, calloc等,跟蹤其對象釋放情況。
-
shared_ptr最推薦的還是用make_shared的初始化方法。shared_ptr和new配合使用也不存在對象泄露問題。
-
最後發現,是有一個消息隊列,stl::queue. 有兩個線程通過一把鎖操作這個隊列。一個線程每次執行loop中push_back兩次, 另外一個線程一次執行中 pop_front一次。兩個線程通過 sem_post 和semwait同步。
最後的結果 queue中push進來的消息積壓,無法及時消費,導致內存持續增大。 msg內容是log,所以前期沒有關注到。