App性能化化学习

Ram,内存(android有限的堆内存只有16M),主要分为以下几部分:

寄存器,程序无法控制,速度最快,处于CPU内部

栈,存放基本类型与对象的引用,仅引用,作用域结束则内存被回收,两个不同的引用指向同一地址时,改变其中一个引用的值不会影响另一个

堆,存放new出来的对象与数组,超出作用域不会释放,没有引用变量指向对象或数据时才可能被GC回收

静态域,静态数据变量

常量池,基本类型常量及对其它类型的符号引用

非RAM,就是硬盘永久的存储空间


监测系统内存使用情况工具:procstats(adb shell dumpsysprocstats –3hours),meminfo(adb shell dumpsys meminfo)


程序中查看内存使用情况:ActivityManager getMemoryClass() getMemoryInfo() Debug.getMemoryInfo


内存分析工具(MemoryAnalysisTools):MAT


减少内存的方法:


Bitmap:

尽量在预览的地方加载缩略图(thumbnails);

显示图片时用命insamplesize缩放(用bitmapfactory.option时,设置injustdecodebounds=true后,解码图片不占内存,解码出来为null,但可以获取到图片尺寸,缩放后设置成false即可,decode时尽量使用stream流而非decodefile);

图片色彩选择RGB565(8888占用四个字节,565无透明度占用两个);

图片使用后记得手动回收,只要bitmap.isrecycle为false,就进行回收,并将bitmap置为null

图片进行decode时,进行异常捕获,避免直接崩溃;


对象的引用类型:

强>软>弱>虚(强引用不会被回收;软引用内存不够时被回收,常用于缓存;弱引用只要被GC发现只具备弱引用对象就会回收,与内存是否足够无关;虚引用,如只具备虚引用对象,则与平常引用一样,任何时候可能被会回收)


其它:

使用final性能不会提升,但能帮助编译器优化代码

静态方法替代虚拟方法,不用更新此方法中对象状态

减少不必要的全局变量,比如static 的context,context超出其生命周期会引起泄漏,一般使用getapplicationcontext

避免创建不必要的临时对象

避免内总的get与set调用,虚拟调用比直接访问代价高

避免使用浮点数,浮点数比整数慢两倍

使用实体类比接口好,如Map a= newHashmap,不如hashmap a= new Hashmap

避免使用枚举,枚举类在编译时进行检查,但会牺牲性能

For循环,访问成员变量比本地变量要慢,如for(int i=0;i<this.count;i++)比 intcount=this.count for(int i=0;i<this.count;i++)要慢


一些类库的使用:

String:lastindexof,indexof都用使用c/c++实现的

Library:使用库而非自己重写,系统空闲时会用汇编代码调用library

System.arraycopy在有jit的nexus上,比自己编码运行快

Format\dataformat类提示IP地址及时间等转换非常高效

Textutils,不用考虑正则表达式处理比较简单

Memoryfile,不想用ndk的可以使用memoryfile,适用于对i/o频繁操作的,该类直接继承object,通过JNI方式直接在C底层运行

 

重复使用内在的方法:

缓存cache及池pool


Bitmap缓存:

内存缓存,代表为lrucache,实现原理主要是将最近被引用的对象存储到一个强引用的linkedhashmap里(软引用与弱引用已不被推荐使用);

硬盘缓存,速度比内存中存取慢,需要用后台线程使用

图片缓存框架

Universalimageloader;Picassosquare;imagecache;volley

Adapter适配器,通过viewholder及convertview来进行缓存处理


池缓存:

对象池,将生成了对象放入池,下次拿出来使用

线程池,java中提供了executorservice


视图的review:

视图分层查看工具hierarchyviewer


View使用时的一些特点:

Viewstub,此标签下的所有view不占内存,特殊情况下可设置view的不可见性

Include,加载外部xml到本结构,复用

Merge,可通过删除多余或额外的层级,减少视图层次

JAVA代码编写布局比XML要快

重复利用系统资源,如id,style,color,string以及drawable等