Android内存优化之内存泄漏

内存泄漏

内存泄漏一般有以下几种情况:单例、静态变量、Handler、匿名内部类、资源使用未关闭

单例导致的内存泄漏

单例的情况主要是因为单例的生命周期比较长,如果引用的一些资源(比如Context、图片等)没有做特殊处理,就容易导致内存泄漏。具体的分析可以查看文章:Android 单例模式的正确姿势

静态变量导致的内存泄漏

静态变量的生命周期同样很长,如果引用了一些资源没有及时释放的话就会导致内存泄漏,比如Context、图片的引用等。

引用图片资源,这样写就要小心了。

private static LinkedHashMap<String, Bitmap> mapPool;
复制代码

引用的是Context,比如Activity。

public class MyActivity extends AppCompatActivity {private static MyClass myClass;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);if (myClass == null) {myClass = new MyClass(this);}}class MyClass {MyClass(Activity activity) {}}
}
复制代码

Activity退出后myClass仍然持有Activity的引用导致Activity无法被回收。

Handler导致的内存泄漏

Handler导致的内存泄漏需要先充分理解Android的消息机制,其中跟内存泄漏有关的一个点就是消息Message会持有Handler引用,这样的话如果消息队列中有消息还没有处理完的话,Handler就无法释放,这个时候如果Handler里面还引用了Activity或是其他资源,那就会导致内存泄漏。

一种情况是Handler是内部类,由于内部类会默认引用外部类,这时候如果外部是Activity等,就可能造成内存泄漏

public class MainActivity extends AppCompatActivity {private static LinkedHashMap<String, Bitmap> mapPool;private class MyHandler extends Handler {@Overridepublic void handleMessage(Message message) {}}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}}
复制代码

解决方式也简单,就是将Handler定义为静态内部类。当然如果Handler里面还显示引用了Context或是View等资源,最好用弱引用。

匿名内部类

匿名内部类导致的内存泄漏原因是匿名内部类会默认引用外部类,如果外部类是Activity等资源型类的话就会导致内存泄漏。所以你看我们通过自动工具生成的一些类,比如我们用GsonFormat生成的实体Bean,内部类都是静态的。

资源使用未关闭

资源使用未关闭这个比较好理解,常见的资源类型有广播BraodcastReceiver、ContentObserver、File、数据库游标Cursor、以及Stream和Bitmap。在使用这些资源时我们就需要注意在不使用的时候需要及时释放这些资源。

系统bug导致的内存泄漏

这种情况不用检测工具很难发现,比如LeakCanary。这里就记录一个InputMethodManager导致的内存泄漏。具体情形和解决方法可以查看文章:Android InputMethodManager内存泄漏 解决方法总结

感谢尘封的落叶的提醒。


                    欢迎关注我的微信公众号,和我一起每天进步一点点!
复制代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450696.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cmd - 使用curl命令的注意点

前言 最近在cmd中使用curl命令来测试rest api&#xff0c;发现有不少问题&#xff0c;这里记录一下。 在cmd中使用curl命令的注意事项 json不能由单引号包括起来json数据里的双引号要用反斜杠\转义json数据里不能带有空格如果想要在json数据里使用空格则必须用双引号将整个json…

指针常见定义

再给出常用的C变量的定义方式&#xff1a;a) 一个整型数&#xff08;An integer&#xff09; b) 一个指向整型数的指针&#xff08;A pointer to an integer&#xff09; c) 一个指向指针的的指针&#xff0c;它指向的指针是指向一个整型数&#xff08;A pointer to a pointer …

场景应用题目常见面试真题详解

文章目录1. 场景应用1.1 微信红包相关问题1.2 秒杀系统相关问题1.3 扫码登录流程1.4 如何实现单点登录&#xff1f;1.5 如何设计一个本地缓存&#xff1f;1. 场景应用 1.1 微信红包相关问题 参考答案 概况&#xff1a;2014年微信红包使用数据库硬抗整个流量&#xff0c;2015…

后Kubernetes时代的微服务

\本文要点\\当前微服务架构依然是最流行的分布式系统架构风格。Kubernetes和云原生运动已大规模地重新定义了应用设计和开发中的一些方面。\\t在云原生平台上&#xff0c;服务仅具备可观测性是不够的。更基本的先决条件是使用检查健康、响应信号、声明资源消耗等手段实现微服务…

Dynamics CRM On-Premise V9安装手记

下载地址&#xff1a; https://download.microsoft.com/download/A/D/D/ADDD6898-4EFA-46FA-80B6-6FE9A3CDED63/CRM9.0-Server-CHS-amd64.exe 安装支持Windows 2016 及SQL Server 2016 SP2以上版本 我想安装了All in one的&#xff0c;就想着用最新的SQLServer 2017&#xff0c…

金山网络CEO傅盛:简约之美

摘要&#xff1a;金山网络CEO傅盛带来了主题为《简约之美》的精彩演讲。他表示由于时代的变迁&#xff0c;红海的竞争&#xff0c;项目的需求等原因&#xff0c;若想项目取得成功&#xff0c;唯有简单才是王道&#xff0c;唯有简单定位才能深入人心。那么&#xff0c;如何做到简…

zookeeper安装和使用 windows环境

简介 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;…

计算机网络常见面试真题详解

文章目录1. 计算机网络1.1 请介绍七层网络体系结构。1.2 请介绍五层网络体系结构。1.3 了解网络编程协议吗&#xff1f;客户端发送给服务器的请求&#xff0c;怎么确定具体的协议&#xff1f;1.4 TCP、HTTP、FTP分别属于哪一层&#xff1f;1.5 讲一下TCP/IP协议。1.6 说一说你对…

2018.09.14python学习第四天part2

流程控制之while循环 1.什么是循环&#xff1f;&#xff08;what&#xff09; 循环是指重复做某一件事 2.为何要有循环&#xff1f;&#xff08;why&#xff09; 为了让计算机能像人一样重复去做某一件事 3.如何使用循环&#xff1f;&#xff08;how&#xff09; #语法一&#…

git操作指令合集

1.下载完git&#xff0c;需要输入用户名和邮箱 git config --global user.name "Your Name" git config --global user.email "emailexample.com" 注意git config命令的--global参数&#xff0c;用了这个参数&#xff0c;表示这台电脑上所有的GIt仓库都会使…

C++回调函数(callback)的使用

什么是回调函数(callback) 模块A有一个函数foo&#xff0c;它向模块B传递foo的地址&#xff0c;然后在B里面发生某种事件&#xff08;event&#xff09;时&#xff0c;通过从A里面传递过来的foo的地址调用foo&#xff0c;通知A发生了什么事情&#xff0c;让A作出相应反应。 那么…

Hibernate JPA中@Transient、@JsonIgnoreProperties、@JsonIgnore、@JsonFormat、@JsonSerialize等注解解释

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1、Transient Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性&#xff1b; 如果一个属性并非数据库表的字段…

可爱的rem

前端开发中&#xff0c;移动端的开发可以说是举足轻重了&#xff0c;可是又面临着不同设备尺寸和分辨率的尴尬点。今天[2018-09-16]台风山竹登陆广东&#xff0c;来势汹汹&#xff0c;外出是不可能的了&#xff0c;那就宅着写写这篇小文章吧...原文请戳这里-谈谈rem单位 超长的…

kafka直连方式消费多个topic

一个消费者组可以消费多个topic&#xff0c;以前写过一篇一个消费者消费一个topic的&#xff0c;这次的是一个消费者组通过直连方式消费多个topic,做了小测试&#xff0c;结果是正确的&#xff0c;通过查看zookeeper的客户端&#xff0c;zookeeper记录了偏移量 package day04 /…

100个经典的C语言算法

100个经典的C算法 C语言的学习要从基础开始&#xff0c;这里是100个经典的算法 题目&#xff1a;古典问题&#xff1a;有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔 子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;…

MySQL常见面试题目详解

文章目录1. SQL1.1 介绍一下数据库分页1.2 介绍一下SQL中的聚合函数1.3 表跟表是怎么关联的&#xff1f;1.4 说一说你对外连接的了解1.5 说一说数据库的左连接和右连接1.6 SQL中怎么将行转成列&#xff1f;1.7 谈谈你对SQL注入的理解1.8 将一张表的部分数据更新到另一张表&…

[转]windows系统激活

原文链接主题&#xff1a;使用kms激活&#xff0c;可以直接使用命令来完成。 方法&#xff1a;在win10桌面状态下&#xff0c;右击windows徽标或按快捷键windowsx&#xff0c;点击命令提示符&#xff08;管理员&#xff09; 用到的命令是slmgr&#xff0c;手动kms激活命令如下&…

jackson annotations注解详解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 官方WIKI&#xff1a;https://github.com/FasterXML/jackson-databind/wiki jackson 1.x和2.x版本的注解是放置在不同的包下的 1.x是在…

JS-for的衍生对象

在js中一般使用方法&#xff1a; 1.常规的for(var i0;i<length;i) 2.for-in:for(var item in list) 3.for of 描述&#xff1a;对应于一个对象的每个属性&#xff0c;或一个数组的每个元素&#xff0c;执行一个或多个语句。 语法&#xff1a;for (variable in [object | ar…

浮点数在计算机中存储方式

C语言和C#语言中&#xff0c;对于浮点类型的数据采用单精度类型&#xff08;float&#xff09;和双精度类型(double)来存储&#xff0c;float数据占用32bit,double数据占用64bit,我们在声明一个变量float f 2.25f的时候&#xff0c;是如何分配内存的呢&#xff1f;如果胡乱分配…