线程造成的内存泄漏

对于线程造成的内存泄漏,也是平时比较常见的,如下这两个示例可能每个人都这样写过:

//——————test1

new AsyncTask<Void, Void, Void>() {

@Override

protected Void doInBackground(Void... params) {

SystemClock.sleep(10000);

return null;

}

}.execute();

//——————test2

new Thread(new Runnable() {

@Override

public void run() {

SystemClock.sleep(10000);

}

}).start();

上面的异步任务和Runnable都是一个匿名内部类,因此它们对当前Activity都有一个隐式引用。如果Activity在销毁之前,任务还未完成, 
那么将导致Activity的内存资源无法回收,造成内存泄漏。正确的做法还是使用静态内部类的方式,如下:

static class MyAsyncTask extends AsyncTask<Void, Void, Void> {

private WeakReference<Context> weakReference;

public MyAsyncTask(Context context) {

weakReference = new WeakReference<>(context);

}

@Override

protected Void doInBackground(Void... params) {

SystemClock.sleep(10000);

return null;

}

@Override

protected void onPostExecute(Void aVoid) {

super.onPostExecute(aVoid);

MainActivity activity = (MainActivity) weakReference.get();

if (activity != null) {

//...

}

}

}

static class MyRunnable implements Runnable{

@Override

public void run() {

SystemClock.sleep(10000);

}

}

//——————

new Thread(new MyRunnable()).start();

new MyAsyncTask(this).execute();

这样就避免了Activity的内存资源泄漏,当然在Activity销毁时候也应该取消相应的任务AsyncTask::cancel(),避免任务在后台执行浪费资源。

资源未关闭造成的内存泄漏

对于使用了BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等资源的使用,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏。

一些建议

1、对于生命周期比Activity长的对象如果需要应该使用ApplicationContext 
2、在涉及到Context时先考虑ApplicationContext,当然它并不是万能的,对于有些地方则必须使用Activity的Context,对于Application,Service,Activity三者的Context的应用场景如下:

**其中:**NO1表示Application和Service可以启动一个Activity,不过需要创建一个新的task任务队列。而对于Dialog而言,只有在Activity中才能创建 
3、对于需要在静态内部类中使用非静态外部成员变量(如:Context、View ),可以在静态内部类中使用弱引用来引用外部类的变量来避免内存泄漏 
4、对于生命周期比Activity长的内部类对象,并且内部类中使用了外部类的成员变量,可以这样做避免内存泄漏:

  1. 将内部类改为静态内部类
  2. 静态内部类中使用弱引用来引用外部类的成员变量

5、对于不再需要使用的对象,显示的将其赋值为null,比如使用完Bitmap后先调用recycle(),再赋为null 
6、保持对对象生命周期的敏感,特别注意单例、静态对象、全局性集合等的生命周期

转载于:https://www.cnblogs.com/poptest/p/4995357.html

老李分享:Android性能优化之内存泄漏3相关推荐

  1. Android 性能优化之内存泄漏检测以及内存优化(上)

    在 Java 中,内存的分配是由程序完成的,而内存的释放则是由 Garbage Collecation(GC) 完成的,Java/Android 程序员不用像 C/C++ 程序员一样手动调用相关函数来 ...

  2. android性能优化 掘金,Android性能优化之内存泄漏

    内存泄漏:内存单元使用完成后未释放,未回收. 理解强弱引用和gc垃圾回收机制后,会更好的理解内存泄漏问题. 在目前的Android项目中,内存泄漏是无法避免的,在编写代码时要是否产生了内存泄漏.内存泄 ...

  3. 老李分享:Android性能优化之内存泄漏 3

    线程造成的内存泄漏 对于线程造成的内存泄漏,也是平时比较常见的,如下这两个示例可能每个人都这样写过: //------test1 new AsyncTask<Void, Void, Void&g ...

  4. Android 性能优化之内存泄漏,使用MATLeakCanary解决问题

    本文授权发布公众号[刘桂林],星球[Hi Android] App进行到最终的测试的时候,往往会出现一些性能上,以及内存上的问题,需要优化,这也是一个Android高级工程师所需要了解并且掌握的知识点 ...

  5. Android 系统性能优化(55)---Android 性能优化之内存优化

    Android 性能优化之内存优化 前言 Android App优化这个问题,我相信是Android开发者一个永恒的话题.本篇文章也不例外,也是来讲解一下Android内存优化.那么本篇文章有什么不同 ...

  6. Android性能优化之内存优化 1

    导语 智能手机发展到今天已经有十几个年头,手机的软硬件都已经发生了翻天覆地的变化,特别是Android阵营,从一开始的一两百M到今天动辄4G,6G内存.然而大部分的开发者观看下自己的异常上报系统,还是 ...

  7. Android面试-Android性能优化和内存优化、APP启动速度一线大厂的实战案例解析

    一.Android 内存管理机制 二.优化内存的意义 三.避免内存泄漏 四.优化内存空间 五.图片管理模块的设计与实现 六.总结 深入探索Android内存优化 第一章.重识内存优化 第二章.常见工具 ...

  8. Android性能优化之内存篇

    2019独角兽企业重金招聘Python工程师标准>>> Google近期在Udacity上发布了Android性能优化的在线课程,分别从渲染,运算与内存,电量几个方面介绍了如何去优化 ...

  9. Android性能优化之内存优化浅析

    一.背景 Android由于是以Java语言为主要开发语言,所以它的内存管理并不像C语言那样由开发者去管理内存的分配以及回收等,而是交由JVM虚拟机的内存回收机制去处理.这就导致我们在开发过程中难免会 ...

  10. Android性能优化OOM内存管理——ADJ

    前言 OOM_ADJ (Out of Memory Adjustment)是android系统在内存不足情况下进行内存调整的重要参数.在处理app启动速度的时候,可以设置主线程的优先级,保证主线程占用 ...

最新文章

  1. 任务感知单目深度估计的3D目标检测
  2. C语言中Static和Const关键字的的作用
  3. Window右键添加“用vim打开”
  4. vue指令-单向和双向绑定
  5. python3(一)数字Number
  6. python解释器的提示符是shell嘛_python解释器怎么运行
  7. date 减去固定时长_javascript – 从Date对象减去日/月/年
  8. Java-ServiceLoader类
  9. Linux系统mongdb还原数据库,MongoDB备份与恢复
  10. 在win10系统下安装ubuntu17.10以及基本配置
  11. 误删PPT文件,如何用EasyRecovery自救?
  12. VS2010 asp.net development server 无法展示svg图片
  13. 收到谷歌实习邀请 “比被清华录取还激动”
  14. 排序算法的代码--选择排序综合训练题
  15. android全渠道浅谈
  16. 点击计算机直接隐藏到任务栏,win7电脑的任务栏被自动隐藏了怎么办?
  17. MVP的精益创业模式
  18. java向量加法_结构-03. 平面向量加法(10) java
  19. 双向可控硅的四象限触发方式
  20. 【学术相关】“博士退学、4平米小屋”,又一篇《致谢》火了

热门文章

  1. 实现网页页面跳转的几种方法(meta标签、js实现、php实现)
  2. 为什么阿里规定需要在事务注解 @Transactional 中指定 rollbackFor?这...
  3. 面试了一个 35+ 岁的大佬,一言难尽......
  4. MySQL 亿级数据分页的优化
  5. 高并发、高性能 Web 架构
  6. python 函数重载_python中有函数重载吗
  7. Java并发编程的艺术(一)并发编程的挑战
  8. RabbitMQ----源码安装
  9. 设置windows服务依赖项
  10. Linux的cat命令详解