Android中内存泄漏的原因及消除内存泄漏的方法

一.Java内存泄漏引起的原因:

 简单的说就是该被释放的对象没有被释放,一直被某个或某些实例持有却不再使用导致GC不能回收。

 1.资源未关闭

 2.静态成员变量持有类的引用;

 3.非静态内部类持有外部类的应用,使用非静态内部类创建静态变量;

 4.单例引起内存泄漏;

 5.线程生命周期不可控;

 6.handler尽量使用静态,handler中looper存在整个activity周期,其内部messager持有handler引用,而handler又持有内的引用。


二.解决内存泄漏的方法:

 1.使用LeakCanary检测内存泄漏:

    首先在项目的build.gradle里配置的依赖dependncies中引入leakcanary的依赖

debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2' testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
    其次,在项目中的BaseApplication中加载

 public class BaseApplication extends Application {

        private RefWatcher refWatcher;

        public static RefWatcher getRefWatcher(Context context) {
            BaseApplication application = (BaseApplication) context.getApplicationContext();
            return application.refWatcher;
        }

        @Override
        public void onCreate() {
            super.onCreate();

            refWatcher = LeakCanary.install(this);
        }

    }
  最后,自定义activity、framgment在Destroy方法中进行内存泄漏的检测

 public class LeakActivity extends Activity {

        @Override
        protected void onDestroy() {
            super.onDestroy();

            RefWatcher watcher = BaseApplication.getRefWatcher(this);
            watcher.watch(this);
        }
    }

public class LeakActivity extends Activity {

        @Override
        protected void onDestroy() {
            super.onDestroy();

            RefWatcher watcher = BaseApplication.getRefWatcher(this);
            watcher.watch(this);
        }
    }

 2.使用DDSM工具:   

 1.在android studio中打开ddms,选中要检测项目的包名->点击ddms左上角小蓝桶->Cause GC

 2.检测结果导出成hprof文件

 3.将hprof-conv.exe上一步的结果转换

    使用mat打开转换结果。


    

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值