内存泄漏原因:
线程造成的内存泄漏
Handler造成的内存泄漏
单例导致内存泄露
静态变量导致内存泄露
非静态内部类导致内存泄露
未取消注册(BroadcastReceiver )或回调导致内存泄露
Timer和TimerTask导致内存泄露
集合中的对象未清理造成内存泄露
资源未关闭或释放导致内存泄露
属性动画造成内存泄露
WebView造成内存泄露
Handler造成的内存泄漏
单例导致内存泄露
静态变量导致内存泄露
非静态内部类导致内存泄露
未取消注册(BroadcastReceiver )或回调导致内存泄露
Timer和TimerTask导致内存泄露
集合中的对象未清理造成内存泄露
资源未关闭或释放导致内存泄露
属性动画造成内存泄露
WebView造成内存泄露
添加依赖:
implementation 'com.squareup.leakcanary:leakcanary-android:1.6.3'
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); if (LeakCanary.isInAnalyzerProcess(this)) {//1 // This process is dedicated to LeakCanary for heap analysis. // You should not init your app in this process. return; } LeakCanary.install(this); } }
要开启sd卡权限
Android内存优化策略:
1)在循环内尽量不要使用局部变量
2)不用的对象即时释放,即指向NULL
3)数据库的cursor即时关闭。
4)构造adapter时使用缓存contentview
5)调用registerReceiver()后在对应的生命周期方法中调用unregisterReceiver()
6)即时关闭InputStream/OutputStream。
7)android系统给图片分配的内存只有8M, 图片尽量使用软引用, 较大图片可通过BitmapFactory缩放后再使用,并及时recycle
8)尽量避免static成员变量引用资源耗费过多的实例。
2)不用的对象即时释放,即指向NULL
3)数据库的cursor即时关闭。
4)构造adapter时使用缓存contentview
5)调用registerReceiver()后在对应的生命周期方法中调用unregisterReceiver()
6)即时关闭InputStream/OutputStream。
7)android系统给图片分配的内存只有8M, 图片尽量使用软引用, 较大图片可通过BitmapFactory缩放后再使用,并及时recycle
8)尽量避免static成员变量引用资源耗费过多的实例。