Android代码内存优化建议-Java官方篇

通常来说,高效的代码需要满足以下两个规则.
1. 不要做冗余的动作
2. 如果能避免尽量不要分配内存

详细建议如下:
1.避免创建不必要的对象
虽然GC可以回收不用的对象,可是为这些对象分配内存,并回收他们同样是需要耗费资源的. 因此请尽量避免创建不必要的对象
(1)如果你需要返回一个String对象,并且你知道它最终会需要连接到一个StringBuffer,请你修改你的实现方式,避免直接进行链接操作,应该采用创建一个临时对象来做这个操作
(2) 当从输入的数据集中抽取Strings的时候,尝试返回原数据的substring对象,而不是创建一个重复的对象,

一个稍微激进点的做法是把所有多维的数据分解成1维的数组:
**一组int数据要比一组Integer对象要好很多。可以得知,两组1维数组要比一个2维数组更加的有效率。同样的,这个道理可以推广至其他原始数据类型。
如果你需要实现一个数组用来存放(Foo,Bar)的对象,尝试分解为Foo[]与Bar[]要比(Foo,Bar)好很多。(当然,为了某些好的API的设计,可以适当做一些妥协。但是在自己的代码内部,你应该多多使用分解后的容易。**

通常来说,需要避免创建更多的对象。更少的对象意味者更少的GC动作,GC会对用户体验有比较直接的影响。
2.选择static而不是Virtual
如果你不需要访问一个对象的值域,请保证这个方法是static类型的.这样方法调用将会快

3.常量声明为StaticFinal
4.避免在类的内部使用Getter/Setters

在面向对象的设计当中应该使用getter/setter,但是在类的内部,你应该直接访问变量!

5.使用包级访问而不是内部类的私有访问

public class Foo {
    private class Inner {
        void stuff() {
            Foo.this.doStuff(Foo.this.mValue);
        }
    }

    private int mValue;

    public void run() {
        Inner in = new Inner();
        mValue = 27;
        in.stuff();
    }

    private void doStuff(int value) {
        System.out.println("Value is " + value);
    }
}

这里重要的是,我们定义了一个私有的内部类(Foo$Inner),它直接访问了外部类中的私有方法以及私有成员对象。这是合法的,这段代码也会如同预期一样打印出”Value is 27”。

问题是,VM因为Foo和FooInner是不同的类,会认为在FooInner中直接访问Foo类的私有成员是不合法的。即使Java语言允许内部类访问外部类的私有成员。为了去除这种差异,编译器会产生一些仿造函数:

/*package*/ static int Foo.access$100(Foo foo) {
    return foo.mValue;
}
/*package*/ static void Foo.access$200(Foo foo, int value) {
    foo.doStuff(value);
}

每当内部类需要访问外部类中的mValue成员或需要调用doStuff()函数时,它都会调用这些静态方法。这意味着,上面的代码可以归结为,通过accessor函数来访问成员变量。早些时候我们说过,通过accessor会比直接访问域要慢。所以,这是一个特定语言用法造成性能降低的例子。

如果你正在性能热区(hotspot:高频率、重复执行的代码段)使用像这样的代码,你可以把内部类需要访问的域和方法声明为包级访问,而不是私有访问权限。不幸的是,这意味着在相同包中的其他类也可以直接访问这些域,所以在公开的API中你不能这样做。

6.避免使用float类型
Android系统中float类型的数据存取速度是int类型的一半,尽量优先采用int类型。
7.使用库函数
例如 array copy的时候,使用System.arraycopy() 。效率大大提高

8.谨慎使用native函数

参考:http://androidperformance.com/2015/07/20/Android-Performance-Memory-Java.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值