美文网首页
常见的内存泄漏及处理

常见的内存泄漏及处理

作者: 浮名虚誉架构师 | 来源:发表于2017-09-04 18:27 被阅读0次

    什么是内存泄漏

    在Java中,内存泄漏的对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用系统内存。

    下面给出了一个简单的内存泄露的例子。循环申请Object对象,并将所申请的对象放入Vector中,如果仅仅释放引用本身,那么Vector仍然引用该对象,所以这个对象对GC来说是不可回收的。因此,如果对象加入到Vector后,还必须从Vector中删除,最简单的方法就是将Vector对象设置为null。

    Android中常见内存泄露

    单例模式的内存泄漏

    修改后的代码

    Handler引起的内存泄漏

    解决方案

    多线程引起的内存泄漏

    修改后的代码

    集合类内存泄漏

    解决方法

    Webview的内存泄漏

    WebView在加载网页后会长期占用内存而不能被释放,因此在Activity销毁后要调用它的destory()方法来销毁它以释放内存

    另一解决的方案就是给webview一个单独的进程,当webview所在的activity销毁时,直接杀掉这个单独开启的进程,此方案的注意点:1.app内进程间通信需要通过广播和aidl交互,2.数据持久化需要通过ContentProvider进行处理

    常用内存泄漏检测工具

    可以使用自带的MAT性能分析工具,也可以使用LeakCanary。这个工具是在Github开源的,是Square公司出品的,其使用简单方便。

    其实无论是AndroidStudio中自带的MAT内存分析工具,还是LeakCanary,原理都是一样的,都是dump java heap出来进行分析,找到泄漏的问题,只是LeakCanary已经帮我们把分析的工作做好了

    相关文章

      网友评论

          本文标题:常见的内存泄漏及处理

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