Android之代码性能优化

对于占用系统资源,两条基本原则:不要做不必要的事;不要分配不必要的内存。

1. 避免建立对象

对象都需要占用系统内存。除非必要,应尽量避免创建对象实例。

Primitive数据类型内存占用情况(单位:Byte):
byte 1 ;short 2 ; int 4 ; long 8; float 4;double 8 ;boolean 1 ;char 2

例如 long[] data = new long[100]
占用内存8*1000 Bytes ,data本身是一个Object,也需占用内存。

Java中一个引用占4byte ,在32位系统上
Object obj=null; //4byte
Object[] objs=new Object[1000]; //至少4*1000byte

一个对象使用的内存量,需要将所有实例变量使用的内存与对象本身的开销(一般是16个字节)相加。这些开销包括一个指向对象的类的引用、垃圾收集信息以及同步信息。另外,一般内存的使用都会被填充为8个字节的倍数。
一个Integer对象会使用24字节(16个字节的对象开销,4个字节用于保存它的int值以及4个填充字节)。
注明:64位操作系统对象开销为16,引用为8;32位系统,对象开销8,应用为4Bytes

2. 使用本地方法

3. 使用实现类比接口好

4. 避免使用内部的getter/setter方法

5. 优先使用改进的for循环,在性能要求苛刻的Arraylist迭代中,考虑采用手写计数循环。

6. 避免使用枚举,

7. 避免使用浮点数。Android设备中,通常浮点数比整数慢两倍

8. 避免深度继承:子类的构建会导致父类的递归构建

9. 谨慎使用异常,且不要在循环中使用try/catch

10. 慎用static

尽可能将常量定义为static final类型:当没有final修饰时,即为变量,访问时通过地址字段查找,取得具体内容;而常量不需要经过查找
例如 :static final int intVal=10; //引用intVal的代码,将直接调用整型值10

11. 使用局部变量

调用方法时传递的参数以及在方法中创建的零时变量都是保存在栈(stack)中,速度较快。其他变量都在堆(Heap)中创建。

12. 乘法和除法用移位操作符代替:左移 <<1位相当于乘以2

13. 集合类

  • 非线程安全的性能较好。Vector , HashTable 是线程安全的,ArrayList和HashMap不是
  • Iterator遍历比直接遍历慢
  • LinkedList插入和删除元素比ArrayList快
  • 固定长度的集合数组较高效:Vector的默认存储能力为10个元素,每次扩展长度时默认自动加一倍,ArrayList是原来的50%。每次扩展,需要将所有现有元素复制到新空间,原先的数组再被回收,比较费时。

14. I/O操作优化

  • 字节流性能优于字符流操作:基于字节操作的I/O接口:InputStream和OutputStream;字符:Writer和Reader
  • 使用缓存优化性能(BufferedInputStream,BufferedReader)
  • 及时关闭I/O流,释放资源

15. 字符串连接使用StringBuffer/StringBuilder(后者非线程安全,性能更好)

16. System.arraycopy()代替通过循环复制数组

17. 避免在循环中调用同步方法

18. 使用条件操作符代替简单的if语句

19. 强引用、弱引用、软引用、虚引用

20. 用static修饰的变量属于类,生命周期很长,应尽量避免static成员变量引用资源消耗过多的实例;Context尽量使用application context;使用弱引用代替强引用,如可以用WeakReference mContext

21. 线程的生命周期不可控,需谨慎对待

22. 图片资源注意及时recycle,压缩减低内存消耗,巧用软引用

23. Cursor及时close

24. onTouchEvent 方法Action_move 事件处理频率控制

25. ListView充分使用缓存机制

26. Android TraceView + MemoryAnalyzer 分析内存使用情况

  • TraceView使用:在DDMS中选中线程,单击“Method Profiling”(stop按钮的左边),…,单击“Method Profiling”按钮停止。然后会相应窗口会弹出
  • 导出heap信息.hprof,在sdk的tools命令下,命令行执行如下命令,讲导出的hprof文件转换成MemoryAnalyzer支持的格式:hprof-conv .hprof newfile.hprof

转载请注明出处

http://andr112.github.io/2016/07/28/Android%E4%B9%8B%E4%BB%A3%E7%A0%81%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/


原文地址
MemoryAnalyzer下载
Java内存占用参考文献1
Java内存占用参考文献2