用过android手机和iPhone手机的都知道,一般情况下,iPhone手机的流畅度是android手机所不能比的,尽管从android4.2开始加入了ProjectBuffer(黄油计划)和android5.0新加的ART虚拟机让android手机有了质的提升,但是却依然相差很多,而我们就是要在有限的空间创造优秀的代码,提升android的性能与稳定性
(一)内存泄露
(1)什么是内存泄露
在java中有些对象的生命周期是有限的,当他们完成了特定的逻辑之后将会被垃圾回收,但是,如果在对象的生命周期本来应该被垃圾回收时还被其他对象持有引用,那就会大致内存泄露,这样随着我们应用的长时间使用,它所占的内存就无限增大
(2)内存泄露会造成什么后果
- 应用卡顿,响应变慢(内存占用过多,虚拟机频繁GC)
- 应用切到后台的时候被变成了空进程,相当于资源都被回收了
- 应用频繁崩溃,主要是内存泄露导致的oom(内存溢出)
事例:
<span style="font-size:18px;">public class TestActivity extends Activity{
private TestUtil util = null;
@Override
protect void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
util = TestUtil.getInstance(this);
}
}</span>
很明显本当TestActivity该被回收时,却被TestUtil所持有
(4)可能导致内存泄露的原因
- Context的使用不当,对context的引用超过其自身生命周期
- 非静态内部类持有外部类的引用(Handler等)
- 内部线程的运行时间超出外部类的生命周期
- 注册的对象没有及时反注册(例如监听器广播等)
- 创建的对象没有及时关闭(Cursor等)
- 对于引用Context的,如果可以使用ApplicationContext尽量时候ApplicationContext
- 对于内部类,可以声明为静态内部类和弱引用来处理
- 对于一些线程生命周期超长的可以在需要销毁的时候手动调用线程的销毁方法,线程的join()方法,AsyncTask作为外部类并且把外部引用设置为弱引用
- 注册对象要记得反注册
- 数据库的Cursor对象在不使用的时候记得及时关闭