Android 应用性能优化(二)高效使用内存

来源:互联网 发布:golang beego 编辑:程序博客网 时间:2024/06/06 05:32

在说高效使用内存之前,首先我们要清楚Java的内存使用机制,堆栈寄存器什么的。这些就没什么好说了百度一下到处都是。下面要说的是一些小细节方面。

1.并不是所有的计算过程中位数越小的数据类型计算越快,使用较小的类型并不会总提高性能:

比如 两个64位整数相加的时候,ARM的寄存器宽是32位的,两个64位整数相加则需要2条指令,两个32位的整数相加只要一条指令。但是两个16位整数相加不仅需要一条指令相加还需要额外的两条指令把两个16位分别转成32位的指令。我们需要知道只用指令数量作为判断代码快慢的依据是不充分的,因为有的指令执行时间长,有的指令执行时间短,而现在的手机CPU很复杂,操作时间需要具体检测。

2.使用内存,在大量数据的前提下使用可以满足要求的最小数据类型对内存的优化是显而易见的,比如在满足需求的情况下选择short数组优于int数组,如果对精度要求不高选择float数组而不是double数组,尽量避免类型转换因为会造成很大的内存开销


3.访问内存,在2的描述中槽中较大类型的数据代价较高,因为用到了指令比较多,此外,代码和数据都驻留在内存中,访问内存本身也有开销,事实上CPU通常都有至少二级缓存,所以这里就提示我们在处理大量数据的时候尽量使用缓存来访问内存,这样开销小,另外可以关注缓存的大小来使得运行更快。


4.内存泄露,当该被释放的对象引用仍然存在的时候就会发生内存泄露,比如Activity的翻转,查看可能引起内存泄露的方式可以用elipse的 MAT+DDMS工具 ,也可以用Adnroid studio直接查看CPU使用以及内存使用。另外还可以用strictMode类来检测内存泄露(发布时记得禁止掉)。


5.内存释放,老生常谈的话题,这里再次强调 Strong,Soft,Weak,Phantom 这四种引用类型的灵活运用可以在垃圾回收机制.gc的时候减少垃圾收集的时间,提高性能。另外可以在主配置文件里面添加 android:largeHeap属性来让应用可以使用更大的堆内存。

6.当内存少的时候,可以考虑使用ComponentCallbacks接口来实现onLowMemory()方法来应对内存使用不足的突发情况。

0 0
原创粉丝点击