2019独角兽企业重金招聘Python工程师标准>>>

##LeakCanary

####简介 LeakCanary是Square公司最近公布的开源项目,旨在消除Android中的内存泄露(Memory Leak),项目地址猛戳这里。

####使用 LeakCanary的使用也非常之简单,仅需要在Application中添加一行代码

public class ExampleApplication extends Application {@Override public void onCreate() {super.onCreate();LeakCanary.install(this);}
}

当然依赖也是必须的

dependencies {debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'}

在这里分别使用了debugCompilereleaseComile是为了在开发测试和发布时,发现内存泄露执行不同Action。

当使用debug编译时,如果Activity发生了内存泄露,LeanCanary会自动发送Notification提醒你,点击之后会展现内存泄露的详细信息,列出相关的对象引用。 并且还会在logcat中打印相关的信息:

In com.example.leakcanary:1.0:1 com.example.leakcanary.MainActivity has leaked:

  • GC ROOT thread java.lang.Thread.<Java Local> (named 'AsyncTask #1')
  • references com.example.leakcanary.MainActivity$3.this$0 (anonymous class extends android.os.AsyncTask)
  • leaks com.example.leakcanary.MainActivity instance
  • Reference Key: e71f3bf5-d786-4145-8539-584afaecad1d
  • Device: Genymotion generic Google Nexus 6 - 5.1.0 - API 22 - 1440x2560 vbox86p
  • Android Version: 5.1 API: 22
  • Durations: watch=5086ms, gc=110ms, heap dump=435ms, analysis=2086ms

如果你认为LeakCanary能做的只有这样,那你就大错特错了。只要你想,它还可以监视任何对象。

RefWatcher refWatcher = LeakCanary.install(this);

然后在你觉得对象要被虚拟机回收的时机让RefWatcher观察这个对象:

refWatcher.watch(obj)

####结果 在使用LeakCanary之后,Square声称减少了94%OOM产生的crash,甚至还发现了Android SDK中的内存泄露。

####原理

其实LeakCanary的原理也很简单,简单来说就是创建了一个WeakReference对象,如果触发了GC之后这个对象存在,则说明发生了内存泄露。接着dump内存,分析引用,发送通知。

  1. RefWatcher.watch()在观察对象中添加一个KeyedWeakReference。
  2. 接着过一段时间,后台线程会检查观察对象是否还存活着,如果是,则触发GC。
  3. 如果观察对象仍然存在,则表示发生了内存泄露。LeakCanary会dump内存生成.hprof文件在应用文件目录下。
  4. 在另一个进程中启动HeapAnalyzerServiceHeapAnalyzer借助HAHA来分析内存。
  5. HeapAnalyzer在dump文件中找到KeyedWeakReference,并且找到泄露的引用。
  6. HeapAnalyzer计算到GG Root的最短路径,并判断是否是一个的内存泄露。如果是,生成引用的路径链。
  7. 最终接口会发送到app进程中的DisplayLeakService,执行接下来的操作,debug环境默认是发送一个Notification。

#####参考地址

  • https://github.com/square/leakcanary
  • https://corner.squareup.com/2015/05/leak-canary.html

转载于:https://my.oschina.net/u/724985/blog/413414

LeakCanary——消除Android中的内存泄露相关推荐

  1. LeakCanary——直白的展现Android中的内存泄露

    之前碰到的OOM问题,终于很直白的呈现在我的眼前:我尝试了MAT,但是发现不怎么会用.直到今天终于发现了这个新工具: 当我们的App中存在内存泄露时会在通知栏弹出通知: 当点击该通知时,会跳转到具体的 ...

  2. android中内存泄露,Android中的内存泄露

    编辑推荐: 本文来自于csdn,本文主要从java的内存模型讲起,最终举出几个内存泄露的例子和解决方案. java运行时内存模型 具体信息:http://gityuan.com/2016/01/09/ ...

  3. Android中出现内存泄露的原因

    短生命周期的对象持有了长生命周期的对象,使得短生命周期对象驻留内存,消耗内存,因为无法让垃圾回收器GC验证这些对象是否不再被使用,无法释放这些内存. 以下会造成内存泄露: a.数据库的cursor没有 ...

  4. android native 代码内存泄露 定位方案

    android native 代码内存泄露 定位方案 java代码的内存定位,暂时我们先不关注.此篇文章,主要围绕c c++代码的内存泄露. ** *欢迎留言,交流您所使用的内存泄露定位方案.*c   ...

  5. Android中的内存泄漏和内存溢出

    一.内存泄漏 1.内存泄漏的现象和本质 内存泄漏(Memory Leak)是指某些对象已经不再使用了,但却无法被垃圾回收器回收内存,还一直占用着内存空间的现象,这就导致这一块内存泄露了. 而垃圾回收器 ...

  6. Android中的内存泄漏

    ** Android中的内存泄漏 ** Android中的内存泄漏: 概念:程序在申请内存后,当该内存不需再使用但却无法被释放 & 归还给程序的现象,对应用程序的影响,容易使得应用程序发生内存 ...

  7. 谈谈android中的内存泄漏

    写在前面 内存泄漏实际上很多时候,对于开发者来说不容易引起重视.因为相对于crash来说,android中一两个地方发生内存泄漏的时候,对于整体没有特别严重的影响.但是我想说的是,当内存泄漏多的时候, ...

  8. Android C++ Native 内存泄露检查工具Raphael使用介绍

    Android C++ Native 内存泄露检查工具使用介绍 实现原理 使用方法 Raphael添加到测试apk 添加项目依赖 同步gradle 启动泄露检测功能 直接使用boardcast功能控制 ...

  9. vs调试c语言检查内存泄露,VisualStudio中检查内存泄露方法

    项目工程中存在内存泄露,被折磨了一晚上,终于查了出来,因为之前没有相关的经验,还比较生疏,在此记录下来,方便以后查找. 对于malloc出的内存的检测方法 这篇文章中详细地记录了从检查到找到确定位置到 ...

最新文章

  1. nyoj239月老的难题
  2. 超600人!近5小时直播!录屏+彩蛋+PPT…你要的都在这!
  3. js设置html不可复制,用JS实现用户禁止WEB复制
  4. 看了还不会装系统,智商肯定不高!
  5. JS 日期格式和时间戳相互转化
  6. ueditor java_编辑器ueditor1.4.3 JAVA环境使用
  7. 联机侠控制台JAVA_我的世界MultiMc启动器
  8. jq onclick 定义_jq中的onclick绑定事件
  9. MySQL 8 安装教程
  10. 灵魂有香气的女子李筱懿|讲述女性自我成长的重要性
  11. mac word 复制自动产生书签
  12. Photoshop抠图(用调整边缘命令抠图)
  13. Linux 基于tar与openssl加密解密压缩包
  14. bom实现方块移动_HTML 方块移动
  15. E22-400M22S(SX1268) CubeMX HAL
  16. 回归基础 java基础数据 数据处理
  17. python import turtle as t_Python Turtle模块的简单应用
  18. 教 你 如 何 唱 歌
  19. 飞飞php影视系统漏洞,飞飞影视最新版前台无限制getshell
  20. AR眼镜语音转文字实测!效果像开了弹幕,对话记录可保存回溯

热门文章

  1. 计算机视觉及机器学习论文、源代码合集
  2. 【杂谈】有三AI专业版学习扑克牌上线,一副扑克,看懂AI核心技术
  3. 2019年有三AI“春季”划,给我一个荣耀,还你一生荣耀
  4. 中国溶解浆市场深度调研及投资战略决策报告2022-2028年版
  5. Unicode与UTF-8互转(C语言实现)
  6. Window 消息大全使用详解(无聊没事做)
  7. 拼多多谋定500个供应链品牌 农民丰收节交易会“拼农货”
  8. P3159 [CQOI2012]交换棋子(费用流)
  9. rsync+shell脚本完成自动化备份
  10. ALIENTEK 战舰ENC28J60 LWIP和UIP补充例程