为什么会产生内存泄漏?

当一个对象已经不需要再使用了,本该被回收时,而有另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏。

内存泄漏对程序的影响?

内存泄漏是造成应用程序OOM的主要原因之一!我们知道Android系统为每个应用程序分配的内存有限,而当一个应用中产生的内存泄漏比较多时,这就难免会导致应用所需要的内存超过这个系统分配的内存限额,这就造成了内存溢出而导致应用Crash。

一、 Activity 泄漏

1、Activity 泄漏通常是内存泄漏的一种。为什么会泄漏呢?如果你持有一个未使用的 Activity 的引用,其实也就持有了 Activity 的布局,自然也就包含了所有的 View。最棘手的是持有静态引用。别忘了,Activity 和 Fragment 都有自己的生命周期。一旦我们持有了静态引用,Activity 和 Fragment 就不会被垃圾回收器清理掉了。这就是为什么静态引用很危险。

2、如何避免 Activity 泄漏?

  • 移除掉所有的静态引用。
  • 考虑用 EventBus 来解耦 Listener。
  • 记着在不需要的时候,解除 Listener 的绑定。
  • 尽量用静态内部类。
  • 做 Code Review。个人经验:Code Review 能很早的发现内存泄漏。
  • 了解你程序的结构。
  • 用类似 MAT,Eclipse Analyzer,LeakCanary 这样的工具分析内存。
  • 在 Callback 里打印 Log。

二、滑动

实现流畅滑动的技巧:UI 线程只用作 UI 渲染。这一条真谛能够解决 99% 的滑动卡顿问题。不要在 UI 线程做下面的事情:

  • 载入图片
  • 网络请求
  • 解析 JSON
  • 读取数据库

做这些操作是很慢的,像图片,网络,JSON考虑用现成的库,有很多社区提供的解决方案,数据库考虑下用 Loader,支持批量更新和载入

参考文档 Android memory profiler的使用

(Android Studio 3.0)Android Profiler内存泄漏检查​blog.csdn.net

android都图片mat_Android内存泄露整理相关推荐

  1. Android中常见的内存泄露

    内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏.内存泄露有时不严重且不易察觉,这样开发者就不知道存在内存泄露,但有时也会很严重,会 ...

  2. Android使用Handler造成内存泄露的分析及解决方法

    Android使用Handler造成内存泄露的分析及解决方法 参考文章: (1)Android使用Handler造成内存泄露的分析及解决方法 (2)https://www.cnblogs.com/xu ...

  3. Android | 如何计算图片占用内存的大小

    前言 对于一张图片,你知道应该存放在那个资源目录下面吗,或者说,放在那个资源目录下加载起来更省内存呢?在日常开发中我们可能不太注意这些东西,但是这些却是基础,是必不可少的一环,所以这几天重新温习了一下 ...

  4. Android大图片导致内存问题小结

    在网上看了部分Android中OOM的问题,现在根据理解,做一下笔记. Android OOM 产生的几种原因 1. 程序中使用了太多自己创建的Bitmap. 这种情况通常是最好解决的. 因为你明白你 ...

  5. Android下常见的内存泄露

    转自:http://www.linuxidc.com/Linux/2011-10/44785.htm 因为Android使用Java作为开发语言,很多人在使用会不注意内存的问题. 于是有时遇到程序运行 ...

  6. Android下常见的内存泄露 经典

    转自:http://www.linuxidc.com/Linux/2011-10/44785.htm 因为Android使用Java作为开发语言,很多人在使用会不注意内存的问题. 于是有时遇到程序运行 ...

  7. Android性能优化(1) 内存泄露 amp; 解决方案

    前言 在Android中,内存泄露的现象十分常见:而内存泄露导致的后果会使得应用Crash 本文 全面介绍了内存泄露的本质.原因 & 解决方案,最终提供一些常见的内存泄露分析工具,希望你们会喜 ...

  8. Android 中图片占用内存分析

    Android 在加载图片的时候一定会考虑到的一个点就是如何防止 OOM,那么一张图片在加载的时候到底会占用多少内存呢?有哪些因素会影响占用的内存呢?知道了这些,我们才能知道可以从哪些点去优化,从而避 ...

  9. Android之AsyncTask的内存泄露问题

    AsyncTask是Android提供的一种用于异步处理数据的异步类,使用AsyncTask可以不用直接使用Thread和Handler来处理后台操作.AsyncTask被引入到Android中就被贴 ...

最新文章

  1. 阮一峰react demo代码研究的学习笔记 - demo 3 debug
  2. 造句简单_造句游戏的心理投射:被现代心理学摒弃的网红心理游戏
  3. Java中Integer.parseInt()用法
  4. 创建单IP的***网络
  5. 你的 GNN,可能 99% 的参数都是冗余的
  6. Java 方法使用总结(重载、数组输出、enum和switch、foreach和迭代器、可变长度参数、重载中使用可变长度参数)
  7. 多用途响应式ppt资源下载平台-html模板
  8. 【WPF】如何保存RichTextBox的文本到数据库?以及如何对RichTextBox的Document做绑定?...
  9. gRPC创建Java RPC服务
  10. django本地安装mysql_Ununtu 15.04 安装MySql(Django连接Mysql)
  11. 在线2-36进制转文本工具
  12. python hdf5 —— h5py
  13. 转:能和LoadRunner匹敌的VS2010/2012Web负载测试
  14. XShell6免费版获取(个人版)
  15. 导致301状态码的可能的原因
  16. 苹果手机备忘录html转pdf,苹果手机自带的扫描仪,一键便能转成PDF文件,你不会才知道吧...
  17. Gallery中,取消惯性滑动,滑动一次只切换一个视图
  18. hive插件 ranger_Ranger Hive-HDFS ACL同步
  19. 默认语言及Android平台语言支持状态(印度语)Android N 设置中语言列表介绍
  20. Charles抓包出现unknown问题

热门文章

  1. Go 学习笔记(71)— Go 接口 interface (接口定义、接口实现、接口调用、值接收者、指针接收者)
  2. mybatis CRUD操作
  3. PyTorch在NLP任务中使用预训练词向量
  4. 端到端TVM编译器(下)
  5. 使用TensorRT集成推理inference
  6. 大数据目标检测推理管道部署
  7. 数据治理(三):数据质量管理
  8. Mysql中的递归层次查询(父子查询,无限极查询)
  9. Docker核心技术之容器与镜像深入了解
  10. 微信小程序分享注意点