内存泄露记录

原本以为android内存泄露会是大牛才该解决的问题。可是公司就我一个Android啊,代码都是你写的啊,工具持续用一个小时就开始卡顿了,甚至崩溃,你不解决谁解决啊。

于是乎,开始查什么叫内存泄露,内存溢出。看了一大堆文章不是我想要的。从解决结果来说,程序中存在不合理的代码,比如handler,计时器,注册的服务广播什么的没关闭,导致activity关闭的时候,资源没有被系统回收,内存没有被释放,反复操作,内存占用越来越多,知道逼近系统分配给你应用的最大内存,程序开始卡顿,直至崩溃。

那么接下来有几个问题,问题1,一般应用在android studio中的memory应该是多少呢,我测试我的软件是启动8M多一点,打开两三个界面后到16M左右,设备是专用测量设备南方x2,然后打开内存泄露那个界面,关闭后到达20M,反复打开关闭,最终好像有40M,不过我也没耐心测试一个小时,既然知道了这里内存异常了。附as查看应用占用内存情况

然后,开始百度搜索(用百度会不会被用google的鄙视)如何解决内存溢出。最终锁定leakcanary。gradle引用

debugCompile'com.squareup.leakcanary:leakcanary-android:1.4-beta2'

releaseCompile'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'

application中添加

private RefWatcher mRefWatcher;

public voidonCreate() {

mRefWatcher= LeakCanary.install(this);

}

public static RefWatcher getRefWatcher(Context context){

MyApplication baseApplication = (MyApplication) context.getApplicationContext();

return baseApplication.mRefWatcher;

}

然后在BaseAcitivity(没有封装一层直接在每个activity中)的ondestroy中添加MyApplication.getRefWatcher(this).watch(this);

然后运行程序就好了,当关闭activity时有内存泄露的话,屏幕上会有个弹窗提示,然后可以去系统通知栏查看。或者你会发现你多了一个应用程序leaks,打开后发现


然后发现一个activity4.5M内存泄露,惊不惊喜,意不意外,年幼无知的我还不知道4.5M是什么概念,直到我测试出别的界面有内存泄露,不过是100K,13k的时候,我才意识到这个4.5M,真尼玛大啊。然后看错误,第一反应数据库操作cursor没有及时关闭,editTextWatche只是add了,我以前从来不知道还需要remove啊。然后进行了查找cursor有没有没关闭,remove了textwatcher。再次运行依然这几处地方报错,日了uzi了。后来故意在一个界面不关闭游标,运行,竟然没有报数据库的错误。最终折腾了一下午,掉到这两个地方有错误的圈里出不来了,也没解决问题。不过后来再改别的地方是发现一个计时器没有管,联想到了这个界面有个自定义动画,果然,这里也有个计时器没关闭,然后关闭了。运行没有内存溢出了。现在程序稳稳的13M左右运行。问题来了,为什么没有直接指出计时器导致的内存泄露,而是指向这么一些没有真正错误的东西,还有这个东西该怎么读啊?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容