热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

androidxml引用bitmap_Android性能优化:带你全面实现内存优化(文不如图,图不如表)...

Linux编程点击右侧关注,免费入门到精通!作者丨Harvey_Specterhttps:www.jianshu.comp42516966a6ff前言在

640?wx_fmt=gif

640?wx_fmt=jpeg

Linux编程点击右侧关注,免费入门到精通!640?wx_fmt=jpeg作者丨Harvey_Specterhttps://www.jianshu.com/p/42516966a6ff640?wx_fmt=gif前言

在 Android开发中,性能优化策略十分重要


本文主要讲解性能优化中的内存优化,希望你们会喜欢

640?wx_fmt=gif目录

640?wx_fmt=jpeg

640?wx_fmt=gif1. 定义

优化处理 应用程序的内存使用、空间占用

640?wx_fmt=gif2. 作用

避免因不正确使用内存 & 缺乏管理,从而出现 内存泄露(ML)、内存溢出(OOM)、内存空间占用过大 等问题,最终导致应用程序崩溃(Crash)

640?wx_fmt=gif3. 储备知识:Android 内存管理机制

3.1 简介

640?wx_fmt=png

下面,将针对回收 进程、对象 、变量的内存分配 & 回收进行详细讲解

3.2 针对进程的内存策略

a. 内存分配策略

由 ActivityManagerService 集中管理 所有进程的内存分配

b. 内存回收策略

步骤1:Application Framework  决定回收的进程类型


Android中的进程 是托管的;当进程空间紧张时,会 按进程优先级低->>高的顺序 自动回收进程


Android将进程分为5个优先等级,具体如下:

640?wx_fmt=png

步骤2:Linux 内核真正回收具体进程

ActivityManagerService 对 所有进程进行评分(评分存放在变量adj中)

更新评分到Linux 内核

由Linux 内核完成真正的内存回收

此处仅总结流程,这其中的过程复杂,有兴趣的读者可研究系统源码ActivityManagerService.java

3.3 针对对象、变量的内存策略

Android的对于对象、变量的内存策略同 Java

内存管理 = 对象 / 变量的内存分配 + 内存释放

下面,将详细讲解内存分配 & 内存释放策略

a. 内存分配策略

对象 / 变量的内存分配 由程序自动 负责

共有3种:静态分配、栈式分配、 & 堆式分配,分别面向静态变量、局部变量  & 对象实例


具体介绍如下

640?wx_fmt=png

注:用1个实例讲解 内存分配

public class Sample {    
    // 该类的实例对象的成员变量s1、mSample1 & 指向对象存放在堆内存中
    int s1 = 0;
    Sample mSample1 = new Sample();   

    // 方法中的局部变量s2、mSample2存放在 栈内存
    // 变量mSample2所指向的对象实例存放在 堆内存
    public void method() {        
        int s2 = 0;
        Sample mSample2 = new Sample();
    }
}
    // 变量mSample3的引用存放在栈内存中
    // 变量mSample3所指向的对象实例存放在堆内存
    // 该实例的成员变量s1、mSample1也存放在堆内存中
    Sample mSample3 = new Sample();

b. 内存释放策略

对象 / 变量的内存释放 由Java垃圾回收器(GC) / 帧栈 负责

此处主要讲解对象分配(即堆式分配)的内存释放策略 = Java垃圾回收器(GC)

由于静态分配不需释放、栈式分配仅 通过帧栈自动出、入栈,较简单,故不详细描述

Java垃圾回收器(GC)的内存释放 = 垃圾回收算法,主要包括:

640?wx_fmt=jpeg

具体介绍如下

640?wx_fmt=png

640?wx_fmt=gif4. 常见的内存问题 & 优化方案

常见的内存问题如下

内存泄露

内存抖动

图片Bitmap相关

代码质量 & 数量

日常不正确使用


下面,我将详细分析每项的内存问题 & 给出优化方案

4.1 内存泄露

简介


即 ML (Memory Leak),指 程序在申请内存后,当该内存不需再使用 但 却无法被释放 & 归还给 程序的现象

对应用程序的影响


容易使得应用程序发生内存溢出,即 OOM


内存溢出 简介:

640?wx_fmt=png

发生内存泄露的本质原因

640?wx_fmt=png

常见内存泄露原因

集合类

Static关键字修饰的成员变量

非静态内部类 / 匿名类

资源对象使用后未关闭

优化方案


具体请看文章:Android性能优化:关于 内存泄露 的知识都在这里了!

https://www.jianshu.com/p/e719e0c397e5

4.2 图片资源Bitmap相关

优化原因


即 为什么要优化图片Bitmap资源,具体如下图:

640?wx_fmt=png

优化方向


主要 从 以下方面优化图片Bitmap资源的使用 & 内存管理

640?wx_fmt=jpeg

具体优化方案


下面,我将详细讲解每个优化方向的具体优化方案

关于更加具体的介绍,请看文章:Android 性能优化:手把手教你优化Bitmap图片资源的使用

https://www.jianshu.com/p/cd478796a19f

640?wx_fmt=jpeg

4.3 内存抖动

简介

640?wx_fmt=png

优化方案


尽量避免频繁创建大量、临时的小对象

4.4 代码质量 & 数量

优化原因


代码本身的质量(如 数据结构、数据类型等) & 数量(代码量的大小)可能会导致大量的内存问题,如占用内存大、内存利用率低等

优化方案


主要从代码总量、数据结构、数据类型、 & 数据对象引用 方面优化,具体如下

640?wx_fmt=png

4.5 常见使用

优化原因


一些常见使用也可能引发大量的内存问题,下面我将详细介绍。

优化方案

640?wx_fmt=png

还有1个内存优化的终极方案:调大 虚拟机Dalvik的堆内存大小


即 在AndroidManifest.xml的application标签中增加一个android:largeHeap属性(值 = true),从而通知虚拟机 应用程序需更大的堆内存,但不建议 & 不鼓励该做法

4.6 额外小技巧

此处,还有一些内存优化的小技巧希望告诉给大家

技巧1:获取当前可使用的内存大小


调用 ActivityManager.getMemoryClass()方法可获取当前应用可用的内存大小(单位 = 兆)

技巧2:获取当前的内存使用情况


在应用生命周期的任何阶段,调用 onTrimMemory()获取应用程序 当前内存使用情况(以内存级别进行识别),可根据该方法返回的内存紧张级别参数 来释放内存

Android 4.0 后提供的一个API

640?wx_fmt=png

技巧3:当视图变为隐藏状态时,则释放内存


当用户跳转到不同的应用 & 视图不再显示时, 应释放应用视图所占的资源

1.注:此时释放所占用的资源能显著的提高系统的缓存处理容量


2.具体操作:实现当前Activity类的onTrimMemory()后,当用户离开视图时会得到通知;若得到返回的参数 = TRIM_MEMORY_UI_HIDDEN 即代表视图变为隐藏状态,则可释放视图所占用的资源.

640?wx_fmt=gif5. 辅助内存优化的分析工具

哪怕完全了解 内存的原因,但难免还是会出现人为难以发现的内存问题

下面将简单介绍几个主流的辅助分析内存优化的工具,分别是

MAT(Memory Analysis Tools)

Heap Viewer

Allocation Tracker

Android Studio 的 Memory Monitor

LeakCanary

具体使用看内存泄漏那篇文章。

640?wx_fmt=gif6. 总结

本文主要讲解内存优化的相关知识,总结如下:

640?wx_fmt=png

 推荐↓↓↓ 

640?wx_fmt=png

?16个技术公众号】都在这里!

涵盖:程序员大咖、源码共读、程序员共读、数据结构与算法、黑客技术和网络安全、大数据科技、编程前端、Java、Python、Web编程开发、Android、iOS开发、Linux、数据库研发、幽默程序员等。

640?wx_fmt=png万水千山总是情,点个 “好看” 行不行



推荐阅读
  • 尾部|柜台_Java并发线程池篇附场景分析
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java并发-线程池篇-附场景分析相关的知识,希望对你有一定的参考价值。作者:汤圆个人博客 ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 在Java中,我会做这样的事情:classPerson{privateRecordrecord;publicStringname(){record().get(name);}p ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 解决Sharepoint 2013运行状况分析出现的“一个或多个服务器未响应”问题的方法
    本文介绍了解决Sharepoint 2013运行状况分析中出现的“一个或多个服务器未响应”问题的方法。对于有高要求的客户来说,系统检测问题的存在是不可接受的。文章详细描述了解决该问题的步骤,包括删除服务器、处理分布式缓存留下的记录以及使用代码等方法。同时还提供了相关关键词和错误提示信息,以帮助读者更好地理解和解决该问题。 ... [详细]
  • 32位ubuntu编译android studio,32位Ubuntu编译Android 4.0.4问题
    问题一:在32位Ubuntu12.04上编译Android4.0.4源码时,出现了关于emulator的错误,关键是其Makefile里的 ... [详细]
  • HashMap的规约JavaDocs中HashMap的spec是这么写的:Hashtablebased implementationoftheMapinterface.Thisim ... [详细]
author-avatar
lee某某
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有