Android性能优化之内存优化篇

一、内存优化的内功心经

考虑对象的内存占比、创建数量、存取速度、引用链泄露、转换、懒加载、复用性、资源释放等等。

二、内存优化技巧应用场景总结

I、Java优化技巧

1、尽量采用原始数据类型,而不是对象,例如int要比Integer占用更少的内存。

2、如果一个方法不需要访问对象的成员变量,或者调用非静态方法,那么应当将它声明为static。

3、将常量声明为static final。

4、避免内部的getXXX()/setXXX()方法,而是直接访问变量。

5、使用增强的for循环,而不是for(int i = 0; i < 100; i++)这样的循环。

6、避免使用float类型,当对精度要求不高,采用int类型。

II、避免不必要对象的创建

1、单例对象在需要的时候初始化。

2、避免进行自动装箱。

3、预先指定容器的大小。

4、对于占用资源的 Activity,合理的使用LaunchMode。

5、处理屏幕旋转导致的重建。

6、处理字符串拼接。

7、减少不必要的异常。

8、线程复用。

9、合理的使用对象池。

III、保证不使用对象的释放

1、避免 Activity 泄露。

1.1、将Handler定义为静态内部类,这样它就不会持有外部的类的引用,如果需要在handleMessage中调用Activity中的方法,那么可以传入它作为参数,并持有它的弱引用以保证它能够回收。

1.2在Activity的onDestroy()方法中,通过removeCallbacksAndMessages(null)方法移除所有未执行的消息。

1.3、单例中的成员变量或者 static 成员变量持有了 Activity 的引用,根据持有的方式,可以简单地分为直接持有、间接持有两种类型:当出现这种情况时,我们应当注意这几点:如果可以使用Application的Context,那么就用Activity.getApplicationContext()来替代,不要用Activity。如果必须使用Activity,那么确保在Activity的onDestroy()方法执行时,将它们到Activity的引用链想方设法切断,将引用设为空,或者注销监听器。当然不仅是Activity,对于应用当中的某些大对象,例如Bitmap等,我们也应当注意,是否出了类似于上面这种直接和间接引用的情况。

2、对于只执行一次的后台任务,使用 IntentService 替代Service。

3、在 onLowMemory() / onTrimMemory() 回调当中,释放不必要的资源。

4、及时关闭Cursor、IO。

三、使用性能优化工具,定位内存问题

性能优化工具知识梳理(5) - MAT

性能优化工具知识梳理(6) - Memory Monitor & Heap Viewer & Allocation Tracker

性能优化工具知识梳理(7) - LeakCanary



我的GitHub

你可能感兴趣的:(Android性能优化之内存优化篇)