一、LeakCanary
一款非常好用的内存泄露检测工具,能够通过Log的方式告诉你是哪块代码发生了内存泄露。
使用方法:添加依赖 -> Application中install LeakCanary (默认只能检测Activity内容的内存泄露)
debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.1'
releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.1'
public class MyApplication extends Application {
@Override public void onCreate() {
super.onCreate();
LeakCanary.install(this);
}
}
想要检查更多时,注册一个RefWatcher:
public class MyApplication extends Application {
private static RefWatcher sRefWatcher;
@Override
public void onCreate() {
super.onCreate();
sRefWatcher = LeakCanary.install(this);
}
public static RefWatcher getRefWatcher() {
return sRefWatcher;
}
}
然后对某个可能发生泄露的占用大内存的对象进行监测,例如Fragment
public class MyFragment extends Fragment {
@Override
public void onDestroy() {
super.onDestroy();
MyApplication.getRefWatcher().watch(this);
}
}
更多详细使用:https://github.com/square/leakcanary
二、Memory Profiler
Memory Profiler是Android Profiler中的一个组件 ,可帮助您识别因内存泄漏和内存抖动导致的卡顿,无响应,甚至crashes。它显示了应用程序内存使用的实时图形,可以捕获堆信息,强制GC以及跟踪内存分配。
在新版本的Android Studio,可以在底部按钮看到(如下图1),如果没有底部按钮,点击View -> Tool Buttons。
在下图2处选择模拟器或者真机,在下图3选择进程,即可实时监测到CPU,Memory,Network等状态。
点击Memory可以看到如下图提示。
点击heap dump图标,可以看到堆信息
上图中2选择app heap,3按照package排列,从4的com文件夹下可以找到我们的app应用,5为堆中的一些参数。
上图有方则为选中对象的实例和引用,以及各项参数,分析内存使用一般就是看这些实例和引用是否科学,是否存在内存占用过高,存在内存泄漏。
关于上图5中的参数:
Shallow Size:对象本身占用的内存空间,不包含其引用的对象。
Retained Size:对象本身的Shallow Size + 对象能直接或间接访问到的对象的Shallow Size,即该对象被gc之后所能回收内存的总和。
Heap Size: 堆的大小,当资源增加,当前堆的空间不够时,系统会增加堆的大小,若超过上限(如64M,阈值视平台而定)则会被杀掉。
Allocated: 堆中已分配的大小,即App应用实际占用的内存大小,资源回收后,此项数据会变小。