笔者因为在近期须要找工做,因此近期最主要的任务就是准备面试,不打无准备之仗。只有你准备充分了,那么你想获得的机会才可能有机会入你怀中。android
笔者会将准备面试的学习过程记录下来,方便本身复盘的同时也但愿能给一道找工做的小伙伴们一些帮助。笔者准备的内容大纲以下面试
接下来开始本篇博客的正菜:学习
当前占用的内存加上申请的内存资源超过了Dalvk虚拟机的最大内存限制就会抛出Out Of Memory异常。优化
有什么方法能够避免OOM?动画
OOM在不少状况下都是由于图片加载问题,因此针对bitmap的优化能够在某种程度上避免OOM的发生ui
还有没有其余的方法?
1.静态变量持有外部类的引用。
静态变量和应用的生命周期同样,由于静态变量持有外部类的引用,当外部类被销毁时,就会致使外部类没法被GC,引发内存泄漏。因此尽可能不要使用静态变量。
2.单例模式引发的内存泄露
单例模式的对象的生命周期和应用程序同样长,因此它持有的引用也不能被GC,因此会引发内存泄露。
因此在单例模式中,能够把单例对象的引用指向整个应用,就能够避免内存泄露。好比正确的单例模式写法以下:
public class AppManager {
private static AppManager instance;
private Context context;
private AppManager(Context context) {
//this.context = context; //会引发内存泄漏
this.context = context.getApplicationContext(); //指向应用
}
public static AppManager getInstance(Context context) {
if (instance != null) {
instance = new AppManager(context);
}
return instance;
}
复制代码
3.AsyncTask引发的内存泄露
AsyncTask是持有外部类的引用的,当它后台任务没有完成时,它会致使外部类的引用没法被回收,引发内存泄漏。
因此能够经过让AsyncTask变成静态内部类,这样就不会持有外部类的引用了。 或者让它持有外部类的弱引用。
4.使用完的资源未关闭
好比说在Bitmap在使用完后必定要关闭资源(调用它的recycle方法)
5.注册没取消形成的内存泄漏
好比调用registerReceiver后未调用unregisterReceiver。
动态注册
优势: 在android的广播机制中,动态注册优先级高于静态注册优先级,所以在必要状况下,是须要动态注册广播接收者的。
缺点: 当用来注册的 Activity 关掉后,广播也就失效了。
静态注册
优势: 无需担心广播接收器是否被关闭,只要设备是开启状态,广播接收器就是打开着的。