blog.csdn.net/lighthouse666/article/details/70230614
内存优化网络摘抄与总结:
1.内存泄漏
①.单例模式引发的内存泄漏
长生命周期对象(static修饰)引用了短生命周期对象导致。
解决方法:context 改为ApplicationContext。
②.集合操作不当引发内存泄漏
集合存在添加元素的方法,没有相应的删除机制。导致集合所占内存只增不减。
解决方法:删除元素,清空元素
③.线程操作不当引发内存泄露
在主线程中使用new Thread.start 导致内存泄漏,
使用静态内部类实现Runnable .start 没有泄漏
④.匿名内部类/非静态内部类操作不当引发的内存泄露
内部类持有对象引用,无法释放
静态内部类不再持有外部类的引用
⑤.资源未关闭引发的内存泄漏
BraodcastReceiver 注册,反注册。
Sql语句优化,条件查找,精确查找。Cursor关闭。
File Io流关闭,Bitmap关闭。属性动画关闭。
⑥.Handler使用不当
Handler持有Activity的引用,其发送的Message中含有Handler的引用,当队列处理Message时间过长会导致Handler无法被回收
静态实例+弱引用(Weakrefrence)方式销毁对象时候清空队列里的Message
private static class MyHandler extends Handler {
private final WeakReference<HandlerActivity2> mActivity;
public MyHandler(HandlerActivity2 activity) {
mActivity = new WeakReference<HandlerActivity2>(activity);
}
@Override
public void handleMessage(Message msg) {
if (mActivity.get() == null) {
return;
}
mActivity.get().todo();
}
@Override
public void onDestroy() {
// If null, all callbacks and messages will be removed.
mHandler.removeCallbacksAndMessages(null);
}
}
2.内存溢出
1.内存泄漏长时间积累
2.业务操作使用超大内存
优化:
1.调整图像大小后再放入内存、及时回收
2.不要过多的创建静态变量
3.内存优化工具
Square:LeakCanary.
单例写法:
public class AppManager {
private static AppManager instance;
private Context context;
private AppManager() {
this.context = MyApplication.getContext();// 使用Application 的context
}
public static AppManager getInstance() {
if (instance == null) {
instance = new AppManager();
}
return instance;
}
本文地址:https://blog.csdn.net/FlyPig_Vip/article/details/79535242