内存泄露记录

作者: AddisonLi | 来源:发表于2017-07-12 17:37 被阅读67次

原本以为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左右运行。问题来了,为什么没有直接指出计时器导致的内存泄露,而是指向这么一些没有真正错误的东西,还有这个东西该怎么读啊?

相关文章

  • 内存泄露记录

    原本以为android内存泄露会是大牛才该解决的问题。可是公司就我一个Android啊,代码都是你写的啊,工具持续...

  • 内存泄露系列文章(一) - 内存泄露原因及影响

    前言 内存泄露系列文章内存泄露系列文章(一) - 内存泄露原因及影响内存泄露系列文章(二) - 内存泄露监测及分析...

  • 内存泄露系列文章(三) - 内存泄露解决方案

    前言 内存泄露系列文章内存泄露系列文章(一) - 内存泄露原因及影响内存泄露系列文章(二) - 内存泄露监测及分析...

  • 内存溢出与内存泄露

    目录 [TOC] 1 内存泄露与内存溢出的区别 1.1 内存泄露 内存泄露(Memory Leak),指的是堆内存...

  • 内存泄漏详细分析

    首先,什么是内存泄露?经常听人谈起内存泄露,但要问什么是内存泄露,没几个说得清楚。内存泄露是指无用对象(不再使用的...

  • Java弱引用学习 WeakHashMap、ReferenceQ

    上一篇文章 Java内存泄露学习 ThreadLocal真的会内存泄露吗 提到ThreadLocal内存泄露的问题...

  • 内存优化

    内存优化主要是分析内存泄露和内存溢出。将从内存是怎么分配,内存怎么出现泄露和溢出,用工具判断什么情况出现泄露,找出...

  • 内存优化

    内存泄露的原因 四种引用类型 常见的内存泄露 1.内部类导致内存泄露 Handler 2.Context导致内存泄...

  • 内存泄漏/管理

    ARC 下内存泄露的那些点performSelector延时调用导致的内存泄露iOS ARC下几种导致内存泄露的场...

  • 源码分析:LeakCanary 如何实现内存泄露监测

    LeakCanary 是一个非常强大的内存泄露监测工具,可以实现打印内存泄露的信息。Android 的内存泄露检测...

网友评论

    本文标题:内存泄露记录

    本文链接:https://www.haomeiwen.com/subject/pieydttx.html