1.内存抖动
在较短时间内,反复的发生内存增长的回收。【onDraw里面new对象】
2.内存泄漏
本该释放的对象,一直无法释放,最终导致程序可用的内存越来越少,甚至无内存可用(OOM).
3.内存泄漏的场景。
3.1.使用单例模式,由于单例对象一直持有Activity对象,即使当Activity销毁了,mActivity对象也没法被回收。
示例:
public class AppManagerXiangxue {
private static AppManagerXiangxue instance;
private Activity mActivity;
private AppManagerXiangxue(Activity mActivity) {
this.mActivity= mActivity;
}
public static AppManagerXiangxue getInstance(Activity mActivity) {
if (instance != null) {
instance = new AppManagerXiangxue(mActivity);
}
return instance;
}
}
3.2.Handler|AsyncTask引起的内存泄漏.
原因:Handler是通过内部类来创建的,内部类持有外部类Activity的引用,也就是说Handler持有Activity的引用,当通过Handler发送延时Message的时候,因为Message中target就是Handler对象,也就是Message持有handler引用,而handle持有Activity引用,所以当我们关闭Activity的时候,activity的引用也是没有办法被回收。
3.3.资源对象未关闭引起的内存泄露。
- Cursor,Socket在Activity销毁的时候,没有关闭。
3.4.EventBus或者广播在Activity销毁的时候,没有注销。
4.性能优化
4.1.布局优化
使用ConstraintLayout约束布局,减少嵌套,使用include复用,merge,ViewStub标签。
4.2.绘制优化
onDraw里面不要创建新的局部变量,因为onDraw可能会被频繁调用,从而导致内存抖动,onDraw不要做耗时任务,否者会导致view绘制过程不流畅。
4.3.内存优化。【Android Profile 内存分析】
EventBus,File,Cursor,Brocast使用后,在onDestory需要注销.
4.4.线程优化.【Androd Profile 线程分析,看哪些线程占用的cpu时间较长】
使用线程池,可以复用核心线程池,减少频繁创建线程带来的性能开销。
4.5.启动速度优化.
任务异步加载处理