记录几次内存泄露问题

一、 Android客户端在长时间操作后会发生内存不够而崩溃,还好安卓平台有一个强大的堆内存查看工具,如下图:

安卓堆内存查看工具

然后开着这个,不断操作客户端的各个功能,直到发现一进入文件浏览界面(要显示缩略图),堆中75K左右的对象数量就会上涨,而且降不下来,后来拿着缩略图宽高计算了下,一个Bitmap占用空间差不多就是75KB,那基本上就可以确定是缩略图了,经过检查最终发现是bitmap在 踢出缓存时没有调用 recycle(),导致内存没有释放。


二、 前段时间设备端程序在长时间运行后,内存不够导致正常业务无法进行,这个不是安卓系统,ARM芯片平台,大部分是C/C++代码。由于以前看《Linux/Unix系统编程手册》时看到过 sbrk(0)可以获取Program Break(直白的说就是堆内存的顶点,一般情况下出于分配效率,这个值不会降低,系统会考虑到进程可能反复申请内存), 当时就想到可以用这个来检查内存泄露, 这次排上用场,在程序中加一线程,不断打印 sbrk(0)的值,这时反复操作程序各个功能,如果发现反复执行某一操作时,sbrk(0)的值不断上涨,基本可以确认是哪里内存泄露, 最终排查到UI图形控件库在显示文字方面有问题; 


三、同样用sbrk(0)方法,再加上逐步注释掉业务代码的方法,后面又检测到一个内存泄露问题,这次直接定位到一个文件管理库函数,当找到相关负责人,他的态度跟大多数程序员的第一反应是一样的:”不可能!“, 不过后来他检查相关代码,承认了这个问题,原因在于的他的小兄弟在不起眼的地方调用malloc后,但没有free相关内存。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内存泄漏是指在程序执行过程中,动态分配的内存没有被正确释放,导致内存空间被占用并无法再被重复利用的问题内存泄漏问题的排查是找出造成内存泄漏的代码和地方。 在C++中,我们可以通过重载malloc函数来帮助排查内存泄漏问题。malloc函数用于分配内存空间,我们可以自定义一个重载函数,在该函数中添加一些记录和追踪内存分配的操作。 我们可以重载malloc函数来统计分配的内存大小和数量,并将分配的内存记录到一个容器中。可以使用一个全局的哈希表或者链表,每次调用重载的malloc函数时,记录下分配的内存大小和指针地址。当程序结束时,可以输出这个容器中的信息,包括每个分配的内存的大小和对应的指针地址。 通过重载malloc函数,我们可以很容易地定位到哪些地方分配内存后没有及时释放。我们可以在程序中的一些重要位置,比如函数或循环的入口和出口,输出当前的内存分配信息。通过对比入口和出口处的内存分配信息,可以找出内存泄漏的位置。 当然,重载malloc函数仅仅是一种辅助手段,它依赖于程序员的使用和分析。在使用malloc函数时,程序员需要有意识地进行内存的释放操作。只有当程序员规范使用malloc函数,并且及时释放内存时,才能避免内存泄漏问题的发生。 总之,通过重载malloc函数,我们可以在程序运行过程中动态地追踪内存分配的情况,并辅助排查内存泄漏问题。但是,重载malloc函数并不能完全解决内存泄漏问题,程序员仍然需要注意内存的释放操作,以避免内存泄漏的发生。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值