記一次內存泄露調查

近期一個應用程序出現32k/4~5s的內存持續泄露。

排查思路:

  1. 在從業務鏈路上,從上游到下游,梳理數據流通路。
    在其數據收發的幾個類的幾個方法上,通過函數重寫,添加hack函數(不做業務處理),分段查看泄露情況。

  2. 在proc目錄下,查看進程的mappings信息。統計當中{heap},{stack},發現{heap}是有緩慢增加的;其他段是維持固定的。

  3. 通過其他demo應用,進行交叉測試,發現demo沒有泄露。驗證了依賴的三方庫,通信庫,沒有泄露。

  4. 整個工程當中搜索 new, malloc, calloc等,跟蹤其對象釋放情況。

  5. shared_ptr最推薦的還是用make_shared的初始化方法。shared_ptr和new配合使用也不存在對象泄露問題。

  6. 最後發現,是有一個消息隊列,stl::queue. 有兩個線程通過一把鎖操作這個隊列。一個線程每次執行loop中push_back兩次, 另外一個線程一次執行中 pop_front一次。兩個線程通過 sem_post 和semwait同步。
    最後的結果 queue中push進來的消息積壓,無法及時消費,導致內存持續增大。 msg內容是log,所以前期沒有關注到。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章