韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha 313134555@qq.com

首先需要明白一个概念, 内存泄露就是指,本应该回收的内存,还驻留在内存中。 
一般情况下,高密度的手机,一个页面大概就会消耗20M内存,如果发现退出界面,程序内存迟迟不降低的话,可能就发生了严重的内存泄露。 
我们可以反复进入该界面,然后点击dump java heap 这个按钮,然后Android Studio就开始干活了,下面的图就是正在dump 

dump成功后会自动打开 hprof文件,文件以Snapshot+时间来命名 

通过Android Studio自带的界面,查看内存泄露还不是很智能,我们可以借助第三方工具,常见的工具就是MAT了,下载地址 http://eclipse.org/mat/downloads.php ,这里我们需要下载独立版的MAT. 下图是MAT一开始打开的界面, 这里需要提醒大家的是,MAT并不会准确地告诉我们哪里发生了内存泄漏,而是会提供一大堆的数据和线索,我们需要自己去分析这些数据来去判断到底是不是真的发生了内存泄漏。

接下来我们需要用MAT打开内存分析的文件, 上文给大家介绍了使用Android Studio生成了 hprof文件, 这个文件在呢, 在Android Studio中的Captrues这个目录中,可以找到 

注意,这个文件不能直接交给MAT, MAT是不识别的, 我们需要右键点击这个文件,转换成MAT识别的。 

然后用MAT打开导出的hprof(File->Open heap dump) MAT会帮我们分析内存泄露的原因 

LeakCanary

上面介绍了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的更多分析可以看项目主页的介绍,还有这里http://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时间。

我们如何判断可能有问题的方法?

通过方法的调用次数和独占时间来查看,通常判断方法是:

如果方法调用次数不多,但每次调用却需要花费很长的时间的函数,可能会有问题。 如果自身占用时间不长,但调用却非常频繁的函数也可能会有问题。

最新文章

  1. mock the facade
  2. 关于SQL Server将一列的多行内容拼接成一行的问题讨论
  3. MyEclipse、Eclipse复制web项目
  4. 一步一步来做WebQQ机器人-(四)(获取好友列表和群列表)
  5. protobuf 数据解析的2种方法
  6. 在SQL2008R2查询分析器出错(在执行批处理时出现错误。错误消息为: 目录名称无效。)
  7. callsession新功能版
  8. .NET开发问题汇总
  9. Windows7防火墙服务无法启用怎么办
  10. Using Apache2 with JBoss AS7 on Ubuntu
  11. T4模板生成不同部署环境下的配置文件
  12. JavaScript星级评分
  13. ztree实现权限功能(横向显示)
  14. CRT 重启Was
  15. 仓位管理 V4.3
  16. makefile :=和+=
  17. 【转载】C#将图片以二进制流的方式存入数据库
  18. 洗礼灵魂,修炼python(59)--爬虫篇—httplib模块
  19. WPF 任务栏背景闪烁提醒
  20. RFS实例登录126邮箱/利用cookie登陆百度

热门文章

  1. 【Foreign】画方框 [主席树]
  2. java提取SVN提交log
  3. bzoj 3197 DP
  4. bzoj 2440 dfs序
  5. Python作业模拟登陆(第一周)
  6. web-project 故障修复功能 传递所有的event_id数据到后台
  7. 我用.htaccess做了些什么?
  8. JDK1.8特性实现jdk动态代理,使业务解耦
  9. Java中的原子操作类
  10. AtomicReference 和 volatile 的区别