LeakCanary工具使用
转载 来源:于连林520wcf的专栏,https://www.2cto.com/kf/201512/455421.html
上面介绍了MAT检测内存泄露, 再给大家介绍LeakCanary。
项目地址:https://github.com/square/leakcanary
LeakCanary会检测应用的内存回收情况,如果发现有垃圾对象没有被回收,就会去分析当前的内存快照,也就是上边MAT用到的.hprof文件,找到对象的引用链,并显示在页面上。这款插件的好处就是,可以在手机端直接查看内存泄露的地方,可以辅助我们检测内存泄露
使用:
在build.gradle文件中添加,不同的编译使用不同的引用:
1
2
3
4
|
<code
class = "
hljs matlab" >dependencies
{
debugCompile
'com.squareup.leakcanary:leakcanary-android:1.3'
releaseCompile
'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
}</code>
|
在应用的Application onCreate方法中添加LeakCanary.install(this),如下
1
2
3
4
5
6
7
|
<code
class = "
hljs java" > public
class
ExampleApplication extends
Application
@Override
public
void
onCreate() {
super .onCreate();
LeakCanary.install( this );
}
}</code>
|
应用运行起来后,LeakCanary会自动去分析当前的内存状态,如果检测到泄漏会发送到通知栏,点击通知栏就可以跳转到具体的泄漏分析页面。
Tips:就目前使用的结果来看,绝大部分泄漏是由于使用单例模式hold住了Activity的引用,比如传入了context或者将Activity作为listener设置了进去,所以在使用单例模式的时候要特别注意,还有在Activity生命周期结束的时候将一些自定义监听器的Activity引用置空。
关于LeakCanary的更多分析可以看项目主页的介绍,还有这里https://www.liaohuqiu.net/cn/posts/leak-canary-read-me/
追踪内存分配
如果我们想了解内存分配更详细的情况,可以使用Allocation Traker来查看内存到底被什么占用了。
用法很简单:
点一下是追踪, 再点一下是停止追踪, 停止追踪后 .alloc文件会自动打开,打开后界面如下:
当你想查看某个方法的源码时,右键选择的方法,点击Jump to source就可以了
查询方法执行的时间
Android Studio 功能越来越强大了, 我们可以借助AS观测各种性能,如下图:
如果我们要观测方法执行的时间,就需要来到CPU界面
点击Start Method Tracking, 一段时间后再点击一次, trace文件被自动打开,
非独占时间: 某函数占用的CPU时间,包含内部调用其它函数的CPU时间。
独占时间: 某函数占用CPU时间,但不含内部调用其它函数所占用的CPU时间。
我们如何判断可能有问题的方法?
通过方法的调用次数和独占时间来查看,通常判断方法是:
如果方法调用次数不多,但每次调用却需要花费很长的时间的函数,可能会有问题。 如果自身占用时间不长,但调用却非常频繁的函数也可能会有问题。