一、 Android客户端在长时间操作后会发生内存不够而崩溃,还好安卓平台有一个强大的堆内存查看工具,如下图:
然后开着这个,不断操作客户端的各个功能,直到发现一进入文件浏览界面(要显示缩略图),堆中75K左右的对象数量就会上涨,而且降不下来,后来拿着缩略图宽高计算了下,一个Bitmap占用空间差不多就是75KB,那基本上就可以确定是缩略图了,经过检查最终发现是bitmap在 踢出缓存时没有调用 recycle(),导致内存没有释放。
二、 前段时间设备端程序在长时间运行后,内存不够导致正常业务无法进行,这个不是安卓系统,ARM芯片平台,大部分是C/C++代码。由于以前看《Linux/Unix系统编程手册》时看到过 sbrk(0)可以获取Program Break(直白的说就是堆内存的顶点,一般情况下出于分配效率,这个值不会降低,系统会考虑到进程可能反复申请内存), 当时就想到可以用这个来检查内存泄露, 这次排上用场,在程序中加一线程,不断打印 sbrk(0)的值,这时反复操作程序各个功能,如果发现反复执行某一操作时,sbrk(0)的值不断上涨,基本可以确认是哪里内存泄露, 最终排查到UI图形控件库在显示文字方面有问题;
三、同样用sbrk(0)方法,再加上逐步注释掉业务代码的方法,后面又检测到一个内存泄露问题,这次直接定位到一个文件管理库函数,当找到相关负责人,他的态度跟大多数程序员的第一反应是一样的:”不可能!“, 不过后来他检查相关代码,承认了这个问题,原因在于的他的小兄弟在不起眼的地方调用malloc后,但没有free相关内存。