App性能优化之内存优化

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

为什么要进行内存优化呢?其实我们可以反过来想。如果不进行内存优化会产生什么样的问题?

App的运行是有内存限制的,超过限制会产生OOM,导致App崩溃。如果内存不进行优化,运行的内存一旦超出了这个限制,就会导致程序的崩溃。程序的崩溃对于应用程序来说是一个非常严重的。如果App不进行内存优化,在流畅性、响应速度和用户体验上都会有很差的效果。

首先,我们来看一下内存的管理方式。

1、Android系统的内存分配和回收方式。

一个App通常就是一个进程对应一个虚拟机。GC只在heap剩余空间不足时,才会进行垃圾回收。GC触发时,所有的线程都会被暂停。

2、App内存限制机制。

每个App分配的最大内存限制,随着不同的设备而不同。吃内存大户是图片。App中用到的图片也很多。为什么要限制内存呢?我们的手机上有很多个应用。如果一个App把内存用光了,别的App就没有办法运行了。为了避免这种情况的出现,我们必须要限制App的内存。

3、切换应用时后台App清理机制。

App切换时的LRU Cache的方式进行应用间的切换。清理的时候系统会调用onTrimMemory()回调方法。

4、监控内存的几种方法。

其次,App内存的优化方法。

1、数据结构优化。

频繁字符串拼接用StringBuilder。ArrayMap、SparseArray替换HashMap。内存抖动。再小的class也要消耗0.5kb。HashMap一个entry需要额外占用32b。

2、对象复用。

复用系统自带的资源。ListView和GridView 的ConverView复用。避免在onDraw方法里执行对象的创建。

3、什么是内存泄漏,及其应对方法。

在逻辑上,某个内存块已经不用了。由于代码上的失误导致这块内存虽然停止不用了,但是依然被其他东西占用,使得GC无法对它进行回收。

内存泄漏会导致可用的Heap越来越少,频繁触发GC。尤其是Activity泄漏。用Application Context而不是Activity Context。注意Cursor对象是否及时关闭。

最后,OOM问题优化。

1、OOM问题分析。

必然性和可解决性。OOM绝大部分出现在图片上。

2、强引用、软引用的意义。

3、优化OOM问题的方法。

注意临时Bitmap对象的及时回收。避免BitMap的浪费。Try catch某些大内存的分配。加载Bitmap时候缩放比例、解码格式、局部加载。

转载于:https://my.oschina.net/u/2971691/blog/877169

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

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

相关文章

Linux 网络编程详解四(流协议与粘包)

TCP/IP协议是一种流协议,流协议是字节流,只有开始和结束,包与包之间没有边界,所以容易产生粘包,但是不会丢包。 UDP/IP协议是数据报,有边界,不存在粘包,但是可能丢包。 产生粘包问题…

执行Hive语句报错:FAILED: Error in metadata: javax.jdo.JDOFatalDataStoreException: Access denied for user '

安装个Hive真不省心,各种问题。最近安装好Hive后执行Hive语句时碰到这样的错误: hive> show databases; FAILED: Error in metadata: javax.jdo.JDOFatalDataStoreException: Access denied for user rootlocalhost (using password: YES) NestedThr…

阿里云部署django项目流程【centos7+python3+mysql】

购买阿里云服务器 到[阿里云官网],选择轻量应用服务器, 步骤如图所示: 地域随便选择哪一个,镜像的话,对比了CentOS,Debian,Ubuntu,我最终选择了CentOS,因为流行嘛&…

对于频繁的写数据处理方式

添加一个新的表情的时候 调用 recentEmotions方法 将所有表情写入数组 每次都是 添加一个新的表情进来 要将沙盒中的所有表情首先加载进数组,然后将表情添加到数组里面 然后在将数组写入沙盒 处理方式 没有必要每次都要到沙盒里面读取数组文件 类方法 不能访问 成员…

Scrapy 框架【学习笔记01】

Scrapy 框架 Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便。 Scra…

scrapy startproject【学习笔记02】

入门案例 学习目标 创建一个Scrapy项目定义提取的结构化数据(Item)编写爬取网站的 Spider 并提取出结构化数据(Item)编写 Item Pipelines 来存储提取到的Item(即结构化数据) 一. 新建项目(scrapy startproject) 在开始爬取之前,必须创建一个新的Scrapy项目。进入…

TotoiseSVN的上手教程

本文转自:http://www.cnblogs.com/xilentz/archive/2010/05/06/1728945.html TotoiseSVN的基本使用方法: 一、签入源代码到SVN服务器 假如我们使用Visual Studio在文件夹StartKit中创建了一个项目,我们要把这个项目的源代码签入到SVN Serv…

【转载】Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题

转自:【欧阳鹏】http://blog.csdn.net/ouyang_peng Android 设备的CPU类型(通常称为”ABIs”) armeabiv-v7a: 第7代及以上的 ARM 处理器。2011年15月以后的生产的大部分Android设备都使用它.arm64-v8a: 第8代、64位ARM处理器,很少设备,三星 G…

HDFS的简介及基本操作(常用的命令参数介绍)

目录前言:1、HDFS基本概念2、HDFS基本操作总结: 目录 前言: 总算有空来接着写大数据的学习笔记了,今天就把之前学过的HDFS的基础知识详细的介绍一下,如有哪点写的不足希望大家多多指教。 1、HDFS基本概念 1.1、前…

TensorFlow训练单特征和多特征的线性回归

线性回归 线性回归是很常见的一种回归,线性回归可以用来预测或者分类,主要解决线性问题。相关知识可看“相关阅读”。 主要思想 在TensorFlow中进行线性回归处理重点是将样本和样本特征矩阵化。 单特征线性回归 单特征回归模型为:ywxb 构建模…

大数据之HDFS应用开发(java API)

目录1、搭建开发环境2、获取api中的客户端对象3、DistributedFileSystem实例对象所具备的方法4、HDFS客户端操作数据代码示例 目录 1、搭建开发环境 window下开发的说明: A、在windows的某个目录下解压一个hadoop的安装包 B、将安装包下的lib和bin目录用对应windows版本平…

shell脚本执行方式,更方便更快捷。

在进行linux测试时编写脚本是必不可少的。最近经常使用Linux,感觉太频繁地敲击键盘有些累了,于是想到了Shell脚本。可以把太多的命令写成一个脚本,这样每次执行一遍 shell文件,就可以省去了敲击键盘的时间。于是在网上搜了一些有…

慕课网_《Java实现对称加密》学习总结

时间:2017年4月11日星期二说明:本文部分内容均来自慕课网。慕课网:http://www.imooc.com教学示例源码:https://github.com/zccodere/s...个人学习源码:https://github.com/zccodere/s... 第一章:对称加密算…

大数据之MapReduce详解(MR的运行机制及配合WordCount实例来说明运行机制)

目录前言:1、MapReduce原理2、mapreduce实践(WordCount实例) 目录 今天先总体说下MapReduce的相关知识,后续将会详细说明对应的shuffle、mr与yarn的联系、以及mr的join操作的等知识。以下内容全是个人学习后的见解,如…

20155222 2016-2017-2 《Java程序设计》第8周学习总结

20155222 2016-2017-2 《Java程序设计》第8周学习总结 教材学习内容总结 Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。 Java NIO: Channels and Buffers(通道和缓冲区&…

BAT经典面试题精简版(基础知识附答案)

文章目录目录J2SE基础JVM操作系统TCP/IP数据结构与算法目录 J2SE基础 九种基本数据类型的大小,以及他们的封装类。 原始类型封装类 booleanBoolean charCharacter byteByte shortShort intInteger longLong floatFloat doubleDouble Switch能否用string做参数&…

使用2to3.py 转换 python2.x 代码 到python3

1.使用Windows 命令提示符(cmd)cd到2to3.py 脚本所在位置,如下图: 找不到的2 to 3.py的去 pycharm中双击shift搜索一下 2.紧接着运行 2to3.py 脚本(可省略) 3.执行你想要转换的文件 python 2to3.py -w H:…

iis6.0与asp.net的运行原理

这几天上网翻阅了不少前辈们的关于iis和asp.net运行原理的博客,学的有点零零散散,花了好长时间做了一个小结(虽然文字不多,但也花了不少时间呢),鄙人不才,难免有理解不道的地方,还望…

Android学习笔记进阶十之Matrix错切变换

刚开始我也不懂啥叫错切变换,一看效果图你就恍然大悟。 对图像的错切变换做个总结: x x0 b*y0; y d*x0 y0; 与之对应的方法是: [java] view plaincopyMatrix matrix new Matrix(); matrix.setSkew(0.0f, 0.5f);

Django中的核心思想ORM---元类实现ORM

1. ORM是什么 ORM 是 python编程语言后端web框架 Django的核心思想,“Object Relational Mapping”,即对象-关系映射,简称ORM。 一个句话理解就是:创建一个实例对象,用创建它的类名当做数据表名,用创建它…