android动画内存优化,Android 性能优化之内存优化

2023-11-18

定义

内存泄漏(Memory Leak):指 程序在申请内存后,当该内存不需再使用但却无法被释放的现象。

内存溢出(OOM):应用程序所需的内存超出了为其分配的内存限额。

Android将进程分为5个优先等级:

前台进程

可见进程

服务进程

后台进程

空进程

避免内存溢出(OOM)

释放强引用,使用软引用和弱引用;

图片加载

在内存中压缩图片

使用完图片后及时回收图片所占内存

降低要显示的图片色彩质量

查询图片信息时不把图片加载到内存中

常见的内存泄露原因 & 解决方案

1. 集合类内存泄露

说明:集合类添加元素后,仍引用着集合元素对象,导致该集合中的元素对象无法被回收,从而导致内存泄露。

例子

static List mList = new ArrayList<>();

for (int i = 0; i < 100; i++) {

Object obj = new Object();

mList.add(obj);

obj = null;

}

复制代码当mList没用的时候,我们如果不做处理的话,这就是典型的占着茅坑不拉屎,mList内部持有者众多集合元素的对象,不泄露天理难容啊。

解决方案

解决这个问题也超级简单。把mList清理掉,然后把它的引用也给释放掉。

mList.clear();

mList = null;

2、静态变量内存泄漏

说明:静态变量的生命周期跟整个程序的生命周期一致。只要静态变量没有被销毁也没有置null,其对象就一直被保持引用,也就不会被垃圾回收,从而出现内存泄露。

例子

public class MainActivity extends Activity {

public static Test sTest;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

sTest = new Test(this);

}

}

//外部Test类

public class Test {

Test(Context context) {

}

}

sTest作为静态变量,并且持有Activity的引用,sTest的生命周期肯定比Activity长。因此当Activity退出后,由于Activity仍然被sTest引用到,所以Activity就不能被回收,造成了内存泄露。

Activity这种占用内存非常多的对象,内存泄露的话影响非常大。

解决方案

静态变量

在不用静态变量时置为空,如:

sTest = null;

Context

如果用到 Context,尽量去使用 Applicaiton 的 Context,避免直接传递 Activity,比如:

sTest = new Test(getApplicationContext());

Activity

若一定要使用Activity,建议使用弱引用或者软引入来代替强引用。如下:

//弱引用

WeakReference weakReference = new WeakReference(this);

Activity activity = weakReference.get();

//软引用

SoftReference softReference=new SoftReference(this);

Activity activity1 = softReference.get();

3. 非静态内部类(匿名类)内存泄露

说明:非静态内部类 (匿名类)默认就持有外部类的引用,当非静态内部类(匿名类)对象的生命周期比外部类对象的生命周期长时,就会导致内存泄露。

1. Handler 内存泄露

如果 Handler 中有延迟的任务或者是等待执行的任务队列过长,都有可能因为 Handler 继续执行而导致 Activity 发生泄漏。

1.首先,非静态的Handler类会默认持有外部类的引用,包含Activity等。

2.然后,还未处理完的消息(Message)中会持有Handler的引用。

3.还未处理完的消息会处于消息队列中,即消息队列MessageQueue会持有Message的引用。

4.消息队列MessageQueue位于Looper中,Looper的生命周期跟应用一致。

因此,此时的引用关系链是 Looper -> MessageQueue -> Message -> Handler -> Activity。所以,这时退出Activity的话,由于存在上述的引用关系,垃圾回收器将无法回收Activity,从而造成内存泄漏。

解决方案

静态内部类+弱引用

private static class MyHalder extends Handler {

private WeakReference mWeakReference;

public MyHalder(Activity activity) {

mWeakReference = new WeakReference(activity);

}

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

//...

}

}

Activity退出时,移除所有信息(不建议使用)

@Override

protected void onDestroy() {

super.onDestroy();

mHandler.removeCallbacksAndMessages(null);

}

2. 多线程引起的内存泄露

我们一般使用匿名类等来启动一个线程,如下:

new Thread(new Runnable() {

@Override

public void run() {

}

}).start();

同样,匿名Thread类里持有了外部类的引用。当Activity退出时,Thread有可能还在后台执行,这时就会发生了内存泄露。

解决办法:

静态内部类

private static class MyThread extends Thread{

//...

}

Activity 退出时,结束线程

4. 未关闭资源对象内存泄露

说明:一些资源对象需要在不再使用的时候主动去关闭或者注销掉,否则的话,他们不会被垃圾回收,从而造成内存泄露。

常见的需要主动关闭的资源对象:

注销广播

如果广播在Activity销毁后不取消注册,那么这个广播会一直存在系统中,由于广播持有了Activity的引用,因此会导致内存泄露。

unregisterReceiver(receiver);

关闭输入输出流等

在使用IO、File流等资源时要及时关闭。这些资源在进行读写操作时通常都使用了缓冲,如果不及时关闭,这些缓冲对象就会一直被占用而得不到释放,以致发生内存泄露。因此我们在不需要使用它们的时候就应该及时关闭,以便缓冲能得到释放,从而避免内存泄露。

InputStream.close();

OutputStream.close();

回收Bitmap

Bitmap对象比较占内存,当它不再被使用的时候,最好调用Bitmap.recycle()方法主动进行回收。

Bitmap.recycle();

Bitmap = null;

停止动画

属性动画中有一类无限动画,如果Activity退出时不停止动画的话,动画会一直执行下去。因为动画会持有View的引用,View又持有Activity,最终Activity就不能给回收掉。只要我们在Activity退出把动画停掉即可。

animation.cancel();

销毁WebView

WebView在加载网页后会长期占用内存而不能被释放,因此我们在Activity销毁后要调用它的destory()方法来销毁它以释放内存。此外,WebView在Android 5.1上也会出现其他的内存泄露。具体可以看下这篇文章:WebView内存泄漏解决方法。

所以,要防止WebView内存泄露还是比较复杂的。代码如下:

@Override

protected void onDestroy() {

if( mWebView!=null) {

ViewParent parent = mWebView.getParent();

if (parent != null) {

((ViewGroup) parent).removeView(mWebView);

}

mWebView.stopLoading();

// 退出时调用此方法,移除绑定的服务,否则某些特定系统会报错

mWebView.getSettings().setJavaScriptEnabled(false);

mWebView.clearHistory();

mWebView.clearView();

mWebView.removeAllViews();

mWebView.destroy();

}

super.on Destroy();

}

检测工具

1. MAT(Memory Analysis Tools)

简介

一个Eclipse的 Java Heap 内存分析工具 ->>下载地址

作用

查看当前内存占用情况

2. Memory Profiler

简介

Memory Profiler 是 Android Profiler 中的一个组件,可以帮助你分析应用卡顿,崩溃和内存泄露等等问题。

作用

跟踪系统 / 应用的内存使用情况。核心功能如下

3. Leakcanary

简介

Leakcanary 是 Square 开源的一个库,能够自动检测发现内存泄露。

作用

检测内存泄漏

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android动画内存优化,Android 性能优化之内存优化 的相关文章

  • 《Unity Shader入门精要》彩图版免费分享~~~~~

    这书很多地方都要币或者要钱 这里就免费分享了 下面是网盘链接 顺手点个赞或者评论一波呗 下载链接 链接 https pan baidu com s 137Y1nkB6h8HIvKOfwFPnbQ 提取码 f8dw 顺手点个赞 蟹蟹蟹蟹
  • 测试人社区——软件测试技术沙龙分享

    作为软件开发领域中至关重要的一环 软件测试的重要性日益凸显 然而 随着软件测试开发技术的不断发展 软件测试也面临着越来越多的挑战 为了更好地应对这些挑战 测试人社区于2023年3月12日举办了技术沙龙 主题为 探索软件测试前沿技术及最佳实践
  • C++实现UDP可靠传输(一)

    声明 禁止以任何形式转载本文章 本文章仅供个人学习记录与交流探讨 文章中提供的思路只是一种解决方案 代码也并非完整代码 如有需要 请自行设计协议并完成编程任务 食用本文章之前 推荐阅读 C 实现流式socket聊天程序 目录 UDP协议的基
  • TypeError: super(type, obj): obj must be an instance or subtype of type 该错误的一次处理

    我在写maya类的时候遇到 版本python2 7 folder lib mayaclass py base类 A base 类 ui py 其中A继承base ui py文件中内容 python2 7 import imp from fo
  • Java是如何读取和写入浏览器Cookies的

    首先我们认识下什么是cookies cookie实际上是一个存在你硬盘里的数据 但是这些数据很特殊 只能由web应用提交给浏览器帮助存储 并且我们还能读取浏览器存在本地的cookie web应用一般只在cookie中存储一些用户信息等少量且
  • hive sql之将一行中的时间范围转成多行

    一 生成hive 临时表其中date time 包含其实日期和结束日期 with test1 as select A班 as class 2023 03 01 2023 03 14 as date time 100 99 89 as sco
  • CUBEMX+HAL库实现STM32串口(不定长度)收发

    CUBEMX HAL库实现STM32串口接收 不定长度 并发送 首先新建一个CUBEMX工程 选择你自己开发板的芯片型号 设置时钟和串口 设置时钟为72MHZ 设置串口中断 点击小齿轮生成KEIL5的工程 设置工程名称及存放位置 点击Ope
  • Calendar常用的方法的返回结果 获取指定时间点

    Calendar常用的方法的返回结果 public class CalendarText Calendar calendar null Before public void test calendar Calendar getInstanc
  • 和氟西汀类似的备注_氟西汀备注是什么意思 和氟西汀差不多的备注

    氟西汀 这是一个药物名字 是抗郁抑症的药物 这个药物名字也经常用来当做备注名使用 氟西汀备注是什么意思 和氟西汀差不多的备注有哪些 氟西汀备注是什么意思 将对方备注成氟西汀 表示的是对方是驱散自己心中阴霾的阳光 对方是自己活下去的动力 是快
  • Difference between MBCS and UTF-8 on Windows

    I am reading about the charater set and encodings on Windows I noticed that there are two compiler flags in Visual Studi
  • 基于Python Django的公务员考试信息管理系统

    文章目录 1 简介 2 技术栈 3 功能分析 4 功能具体设计 4 1 软件功能模块设计 4 2数据库设计与实现 4 2 1概念模型设计 4 2 2数据库逻辑结构设计 5系统详细设计 5 1系统功能模块 5 2管理员功能模块 六 源码咨询
  • tcpdump抓包对性能的影响

    一直以来 提到这个话题 大家更多的关注的是tcpdump抓包本身的性能 比如能不能应付几十万的pps 能否在万兆网络上自运自如 我们现在知道 这些问题的答案都是否定的 即 不能 因此你应该去关注netmap高性能抓包方案以及DPDK这样的东
  • Linux上配置Jupyter Notebook远程访问

    本身自己机器上安装了太多东西 有点慢 本来也喜欢所有的东西搬到服务上 所以如果能安装一个远程的Jupyter 服务器 用起来就会很方便 记录下自己的安装步骤 1 安装ipython jupyter pip install ipython p
  • 未来简史--读书语句摘录及感悟

    文章目录 摘录 个人感想 摘录 18世纪末的英国哲学家边沁主张 所谓至善就是 为最多人带来最大的快乐 并认为国家 市场和科学界唯一值得追寻的目标就是提升全球的快乐 政治家应该追求和平 商人应该促进繁荣 学者应该研究自然 但不是为了荣耀什么国
  • 在tomcat中发布项目时,用IP地址不能访问项目而用localhost时可以访问成功

    最近在开发项目中 遇到的一个问题是 在 tomcat中发布一个web项目 但是发布成功后 只能用http localhost 8080 fm访问项目 不能用 http 127 0 0 1 8080 fm访问项目 也不能用本地的IP地址访问
  • Request method ‘POST‘ not supported错误和解决方法

    最近使用VUE js开发中遇到了错误Request method POST not supported 字面意思上看是因为前后端没有统一使用POST方法 但是我在本地仔细检查了前端调用方法和后端处理方法 均没有发现有这个问题 最后我发现 问
  • Memcached Redis Membase性能测试对比分析

    最近在在调研分布式缓存 希望后面能够当前改进项目中缓存的使用 这个测试结果可能出乎大家的意料之外哦 测试结果对比分析 单次读写访问Memcached最快 Redis居中 Membase最慢 单次读写Membase和Redis速度比较接近 M
  • 计算机考试如何截屏,教你6种电脑截屏的小技巧-电脑怎么截图

    电脑截屏是我们经常要用到的技能 不仅操作简单而且非常实用 方法也有很多 下面小编总结了6种截屏技巧 供大家选择 分别是以下6种 1 搜狗输入法 2 浏览器 3 截屏软件 4 QQ ctrl ait A 和微信 alt A 5 附件截图工具
  • win10系统下安装Kafka 的详细步骤

    Win10 系统下要使用Kafka需要经过以下三个步骤 1 安装JDK 需要安装依赖java JDK 2 安装zookeeper 资源协调 分配管理 3 安装Kafka 一 安装 Java SE Development Kit 13 0 1

随机推荐

  • 【原创】ESXI6.7+ikuai爱快搭建软路由(非常详细)

    ESXI安装过程我就直接跳过了 这个网上教程多得是 先介绍一下我的测试环境 一台测试电脑CPU G5400 内存32G DDR4 硬盘960G的铠侠 SATA3接口的SSD 网卡 自带的瑞昱8168网卡 一块另外买的瑞昱8168网卡 两条网
  • Linux常见命令整理

    Linux 常用命令 基本命令掌握 磁盘命令 cd ll 文件夹 文件创建命令 mkdir touch 文件浏览 less 文件全盘查找 find 文件操作 cp mv rm 文件编辑 vi 压缩解压 tar 权限命令 其它命令 最终 安装
  • [Qt3d] 导出QtEntity为Obj格式(遍历QtEntity)

    原文链接 https www yuque com softdev qt txv1lx class Qui3DView private struct date struct QPointer
  • java.awt.Color类

    Color类概述 Color是用来封装颜色的 支持多种颜色空间 默认为RGB颜色空间 每个Color对象都有一个alpha通道 值为0到255 代表透明度 当alpha通道值为255时 表示完全不透明 当alpha通道值为0时 表示完全透明
  • Cordova环境搭建/win10下必备依赖环境配置(Android开发)

    Cordova环境依赖 1 win10系统 2 Java环境 3 Node环境 4 AndroidStudio 5 Ant 6 Gradle 安装node环境 1 使用node官网网址下载node包 最好使用稳定版本 https nodej
  • 从C过渡到C ++的3个理由

    几十年来 嵌入式软件工程师之间一直在争论他们应该使用C还是C 根据2020年嵌入式市场调查 在大多数情况下 微控制器制造商提供的软件都以C语言提供 实际上 有56 的嵌入式软件是用C语言编写的 但是 C 逐渐流行起来 大约23 的新嵌入式软
  • Java面向对象编程

    主机甲和乙已建立了TCP连接 甲始终以MSS 1KB大小的段发送数据 并一直有数据发送 乙每收到一个数据段都会发出一个接收窗口为10KB的确认段 若甲在t时刻发生超时时拥塞窗口为8KB 则从t时刻起 不再发生超时的情况下 经过10个RTT后
  • Ubuntu安装git

    使用 apt get install git 安装git 报错 这个错误信息通常表示您的系统上没有可用的 git 软件包 这可能是因为您的软件源列表中没有包含 git 软件包所在的软件源 或者您的软件源列表已经过期 解决 如果您使用的是 U
  • RuntimeError: Attempting to deserialize object on CUDA device 1 but torch.cuda.device_count() is 1.

    成功解决 RuntimeError Attempting to deserialize object on CUDA device 1 but torch cuda device count is 1 报错内容 程序在这一步报错 check
  • Android kotlin自定义自动换行LinearLayout

    目录 1 概述 2 实现步骤 3 kotlin自定义自动换行LinearLayout核心代码实现功能 3 1自定义LinearLayout
  • spring快速入门

    1 导入坐标
  • stack容器

    stack容器 1 stack 基本概念 概念 stack是一种先进后出 First In Last Out FILO 的数据结构 它只有一个出口 栈中只有顶端的元素才可以被外界使用 因此栈不允许有遍历行为 栈中进入数据称为 入栈 push
  • dll load failed: 找不到指定的模块_【已解决】“由于找不到xinput1_3.dll,无法继续执行代码”...

    许多小伙伴在玩游戏或者使用电脑的过程中 电脑突然提示 由于找不到xinput1 3 dll 无法继续执行代码 导致游戏等程序无法正常启动运行 并且导致电脑系统弹窗报错 那xinput1 3 dll丢失怎么修复呢 下面让小编手把手教你解决方法
  • CentOS7安装OpenStack(Liberty)

    1 安装yum源 yum install https buildlogs centos org centos 7 cloud x86 64 openstack liberty centos release openstack liberty
  • 百度智能云千帆大模型三连击:接入LLaMA2等33个模型、上线插件功能和103个Prompt模板

    作为全球首个一站式企业级大模型平台 百度智能云 千帆大模型平台 在提供包括文心一言在内的大模型服务及第三方大模型服务的同时 还提供大模型开发和应用的整套工具链 帮助企业解决大模型从训练到开发过程中的全链条问题 自2023年3月发布以来 千帆
  • 看懂android中的adapter适配器

    首先需要知道一共有4个文件 fragment类 adapter fragment的布局文件 adapter中的item的布局文件 1 首先声明一个控件 RecyclerView 2 然后声明一个adapter类 3 在initView 上
  • python中typeerror_详解python中的TypeError错误解决办法

    新手在学习python时候 会遇到很多的坑 下面来具体说说其中一个 在使用python编写面向对象的程序时 新手可能遇到TypeError this constructor takes no arguments这个错误 例如下面的程序 cl
  • gtest 单元测试工具的基本使用

    gtest 单元测试 gtest 简介 gtest 优点 安装 gtest 测试 demo 总结 gtest 简介 gtest是Google的一套用于编写C 测试的框架 可以运行在很多平台上 包括Linux Mac OS X Windows
  • 获取时间和脸颊、下颚线灯模式

    电流检测的应用 电路检测电路常用于 高压短路保护 电机控制 DC DC换流器 系统功耗管理 二次电池的电流管理 蓄电池管理等电流检测等场景 对于大部分应用 都是通过感测电阻两端的压降测量电流 一般使用电流通过时的压降为数十mV 数百mV的电
  • android动画内存优化,Android 性能优化之内存优化

    定义 内存泄漏 Memory Leak 指 程序在申请内存后 当该内存不需再使用但却无法被释放的现象 内存溢出 OOM 应用程序所需的内存超出了为其分配的内存限额 Android将进程分为5个优先等级 前台进程 可见进程 服务进程 后台进程