您的位置:首页 > 移动开发 > Android开发

Android内存管理和性能优化总结

2015-03-09 15:21 232 查看
1、使用优化过的数据容器:

1.1、使用SparseArray来替换Hashmap,我们知道hashmap的特点就是利用空间换时间,这样在得到效率的同时也消耗很多内存,

而且有很多空间是没有被用到的,就会造成浪费咯,SparseArray字面意思就是稀疏数组(数组中大部分内容值都未被使用),为了

节省空间就采用一种压缩的方式表示稀疏数组的内容!

参考网址:http://liuzhichao.com/p/832.html,具体原理:

下面是一个普通数组图:



这个数组中只有少数几个空间被使用,浪费情况非常严重,下面用稀疏数组来表示:



稀疏数组分成两个部分,第一部分记录原数组的列数和行数以及元素使用个数,第二部分记录原数组中元素的位置和内容,使用压缩之后就

节省的大量空间

2、避免使用Enum类:

枚举类的使用非常方便,提供字面意思说明,而且会有提供编译时的检查,也有完善的API,但是它会牺牲执行的速度以及大幅增加文体面积。

例如:

    public class FOO{

public enum Sho{ A,B,C}

}

就这样一个枚举类就产生一个900字节的.class文件(FOO$Sho.class),在其首次被调用时就会调用初始化方法来准备每一个枚举类,每个枚举项都会

被声明成一个静态变量,并被赋值,然后把这些静态变量放在一个名为$vVALUES的静态数组中,为了这三个变量用了一大堆代码。Sho s=Sho.A会引起

一个对静态变量的引用,如果这个静态变量是final int,那么编译器会直接内联这个常数。

枚举类提供完善的API使得你的代码更出色,同时提供编译时的检查,所以在一般情况下应该使用枚举类,但如果对性能方面有限制就应该要避免使用enum!

3、一些常用的内存开销:

3.1、使用枚举类会比普通静态常量多消耗一倍资源

3.2、java中每个类(包括匿名内部类)大约使用500个字节

3.3、每个类实例在运行内存(RAM)中占用12到16个字节

使用很多的不必要类和对象时,增加了分析堆内存的复杂度,还有就是尽量避免使用依赖注入框架,因为这些框架通过注解的方式扫描你的代码来执行一系列

的初始化,但是也会映射大量的不必要代码进入内存,被映射后的数据会被分配到干净的内存中,然后又长时间不使用,这样就会造成内存浪费!

4、使用工具优化:

4.1、使用代码混淆工具ProGuard来去除一些没有用的代码和通过语义模糊来重命名类,字段和方法来缩小、优化和混淆你的代码,使用它能使你的代码更简洁

更少量的RAM映射页

4.2、apk签名工具:

如果生成apk文件之后没有进行签名,那么你的应用所使用的一些资源不会再从apk中的进行映射,从而导致使用更多的内存!

5 、Activity视图变为隐藏状态后释放资源:

当实现当前 Activity 类的 onTrimMemory() 回调方法后, 用户离开视图时会得到通知. 使用该方法可以监听 TRIM_MEMORY_UI_HIDDEN 级别, 当你的视图

元素从父视图中处于隐藏状态时释放视图所占用的资源.

注意只有当你应用的所有视图元素变为隐藏状态时你的应用才能收到 onTrimMemory() 回调方法的 TRIM_MEMORY_UI_HIDDEN . 这个和 onStop() 回调

方法不同, 该方法只有当 Activity 的实例变为隐藏状态, 或者有用户移动到应用中的另外的 activity 才会引发. 所以说你虽然实现了 onStop() 去释放 activity

的资源例如网络连接或者未注册的广播接收者, 但是应该直到你收到 onTrimMemory(TRIM_MEMORY_UI_HIDDEN)才去释放视图资源否则不应该释放视图

所占用的资源. 这里可以确定的是如果用户通过后退键从另外的 activity 进入到你的应用中, 视图资源会一直处于可用的状态可以用来快速的恢复 activity.


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: