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等