1.使用Service风险,不容易被kill,就会导致进程变得非常消耗内存
官方推荐使用IntentService,可以在执行完任务后关闭进程,避免service内存泄漏
2.当界面不可见时释放内存 重写onTrimMemory
3.避免bitmap使用过度
4.使用优化过的数据集合 如SparseArray,SparseArray,
SparseArray<String> array=new SparseArray<String>();
array.put(1, "小郭");
5.内存的开支情况
(1)使用枚举通常会比使用静态常亮消耗两倍以上内存
(2)任何一个java类,包括内部类,匿名类都要占用大概500字节的内存空间
(3)任何一个类的实例要消耗12-16字节的内存开支,因此频繁创建实例也会一定程度上影响内存
(4)在使用HashMap时,即使你只设置领一个基本数据类型的键,比如说int,但是也会按照对象
的大小来分配内存,大概是32字节,所以进程使用优化过的数据集合
6.反抽象编程理念
在面向对象的世界里,使用抽像是一种被崇尚 的思想,使用抽象编程会提高代码的维护性与可扩展性
但是,使用抽象会带来额外的内存开销,因为抽象的编程方法需要编写额外的代码,虽然这些代码
根本执行不到,但是却要映射到内存中,不仅占用了更多的内存,在执行效率方面也会有所降低
服务器可以用抽象,因为服务器内存大
一切以性能,高效为宗旨,请不用滥用抽象编程
7.避免使用依赖注入框架
8.使用ProGuard混淆代码 对代码有压缩和优化代码的功能。(在tools文件夹下边)
9.使用多个进程
在AndroidManifest文件的应用程序组件中声明一个Android:Process属性
高性能编码技巧:
1.避免创建不必要的对象
下面是避免创建对象的场景
(1)如果我们有一个需要拼接的字符串,那么可以优先考虑使用StringBuffer或者StringBuilder来进行拼接
(2)尽量使用基本数据类型而不使用封装性数据类型,int比Integer更高效
(3)如果我们明确的知道调用方法将这个返回String 在进行拼接操作的话,直接返回一个stringBuffer
(4)基本数据类型要优于对象数据类型,类似的,基本数据类型的数组也优于对象数据类型的数组。两个平行的数组
要比一个封装好的对象数组更高效
一个基本原则就是尽可能少创建临时对象,越少的对象意味着越少的GC操作,同时也就意味着越好的程序性能和
用户体验
2.静态优于抽象
静态方法调用的速度提升15%-20%,同时也不用为了调用这个方法而专门去创建一个对象。另外这也是一种好的编程
习惯。因为我们可以放心得调用静态方法,而不用担心调用这个方法后是否改变对象的状态(静态方法内无法访问非静态的字段)
3.对常量使用static final修饰符
这种优化方法只对基本数据类型以及String 类型的常量有效
4.避免在内部使用getter和setter方法(看情况)
因为字段搜寻要比方法调用使用效率高的多,我们直接访问某个字段可能要比通过getter方法去访问这个
字段要快3-7倍
5.使用增强for循环语句(看情况)
用ArrayLsit,手写计数循环要快3倍
int count=a.length;
for(int i=0;i<count;i++){
}
6.考虑包而不是私有的内部类访问
当一个类的内部类想访问这个类的私有有属性时,在编译时就会产生多于的静态方法,所以通过声明被内部
类方法的字段或者或者成员为包访问权限(private改public)
7.避免使用浮点数。浮点数比整型慢两倍
8.多使用系统封装好的API
9.使用实现类比接口好
Map a=new HashMap();
HashMap b=new HashMap();推荐写法
调用一个接口的引用会比调用实体类的引用多花费一倍的时间
10将成员变量缓存到本地
访问成员变量时,如果将它缓存到本地,成员变量的访问就会变成效率更高的栈变量访问