记一次内存泄露调查

近期一个应用程序出现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,所以前期没有关注到。

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