linux下程序占用内存只涨不降原因追查

        这几天在做战斗校验压测的时候发现,战斗校验进程占用内存一直在涨,而且长时间不降,但是相同逻辑在windows下跑的时候,校验结束进程占用内存就会降下来,这里记录一下整个追查过程。

        首先怀疑有内存泄露,于是先用valgrind

valgrind --tool=memcheck --leak-check=full --log-file=/tmp/bc_leak ./battle_check

校验几场场战斗后得到结果并没有"definitely lost", "indirectly lost", "possibly lost", "still reachable", and "suppressed"这五种级别的泄露提示,据此判断,应该是没有内存泄露。 

         根据上面的检测结果,分析一下,没有泄露,但是进程占用内存又一直在增加,那应该是从系统申请了内存但是没有还回去,那什么操作会导致这样的结果呢,继续追查,这次该拿出系统调用追踪利器strace

strace -tt -f -o /tmp/bc_leak_strace ./battle_check

同时结合top命令

top -p 17626 -d 0.1

这样可以观察在进程res占用增大的时候,系统调用是什么,得到的数据是这样的,在res猛增的时候,一直在跑brk调用   

 

而后是没有对应的释放操作的,于是上网查了一下brk申请内存导致只涨不降的情况,发现还挺多的,主要是glibc的优化,brk比mmap性能好,小内存是brk申请,大内存就是mmap申请,但是brk申请的内存回收有个限制,如果最后申请的内存还在用的话,之前所有不在用的内存都不能回收,除非用malloc_trim(0)强制回收,找到症结之后,在每场校验最后加了强制回收空闲内存的逻辑,

 

这会触发之前大量的内存被回收,在我的逻辑中,内存从250m增长到460m,然后一次全部回收完,校验进程占用的内存会回到最原始的250m。

这里贴一下相关文章,单价可以参考:

glibc下的内存管理 - lookof - 博客园

内存泄漏之malloc_trim - 寒魔影 - 博客园

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值