一、内存优化的内功心经
考虑对象的内存占比、创建数量、存取速度、引用链泄露、转换、懒加载、复用性、资源释放等等。
二、内存优化技巧应用场景总结
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。
三、使用性能优化工具,定位内存问题
性能优化工具知识梳理(6) - Memory Monitor & Heap Viewer & Allocation Tracker
网友评论