LeakCanary——消除Android中的内存泄露
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'}
在这里分别使用了
debugCompile
和releaseComile
是为了在开发测试和发布时,发现内存泄露执行不同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内存,分析引用,发送通知。
RefWatcher.watch()
在观察对象中添加一个KeyedWeakReference。- 接着过一段时间,后台线程会检查观察对象是否还存活着,如果是,则触发GC。
- 如果观察对象仍然存在,则表示发生了内存泄露。LeakCanary会dump内存生成
.hprof
文件在应用文件目录下。 - 在另一个进程中启动
HeapAnalyzerService
,HeapAnalyzer
借助HAHA来分析内存。 HeapAnalyzer
在dump文件中找到KeyedWeakReference
,并且找到泄露的引用。HeapAnalyzer
计算到GG Root的最短路径,并判断是否是一个的内存泄露。如果是,生成引用的路径链。- 最终接口会发送到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中的内存泄露相关推荐
- LeakCanary——直白的展现Android中的内存泄露
之前碰到的OOM问题,终于很直白的呈现在我的眼前:我尝试了MAT,但是发现不怎么会用.直到今天终于发现了这个新工具: 当我们的App中存在内存泄露时会在通知栏弹出通知: 当点击该通知时,会跳转到具体的 ...
- android中内存泄露,Android中的内存泄露
编辑推荐: 本文来自于csdn,本文主要从java的内存模型讲起,最终举出几个内存泄露的例子和解决方案. java运行时内存模型 具体信息:http://gityuan.com/2016/01/09/ ...
- Android中出现内存泄露的原因
短生命周期的对象持有了长生命周期的对象,使得短生命周期对象驻留内存,消耗内存,因为无法让垃圾回收器GC验证这些对象是否不再被使用,无法释放这些内存. 以下会造成内存泄露: a.数据库的cursor没有 ...
- android native 代码内存泄露 定位方案
android native 代码内存泄露 定位方案 java代码的内存定位,暂时我们先不关注.此篇文章,主要围绕c c++代码的内存泄露. ** *欢迎留言,交流您所使用的内存泄露定位方案.*c ...
- Android中的内存泄漏和内存溢出
一.内存泄漏 1.内存泄漏的现象和本质 内存泄漏(Memory Leak)是指某些对象已经不再使用了,但却无法被垃圾回收器回收内存,还一直占用着内存空间的现象,这就导致这一块内存泄露了. 而垃圾回收器 ...
- Android中的内存泄漏
** Android中的内存泄漏 ** Android中的内存泄漏: 概念:程序在申请内存后,当该内存不需再使用但却无法被释放 & 归还给程序的现象,对应用程序的影响,容易使得应用程序发生内存 ...
- 谈谈android中的内存泄漏
写在前面 内存泄漏实际上很多时候,对于开发者来说不容易引起重视.因为相对于crash来说,android中一两个地方发生内存泄漏的时候,对于整体没有特别严重的影响.但是我想说的是,当内存泄漏多的时候, ...
- Android C++ Native 内存泄露检查工具Raphael使用介绍
Android C++ Native 内存泄露检查工具使用介绍 实现原理 使用方法 Raphael添加到测试apk 添加项目依赖 同步gradle 启动泄露检测功能 直接使用boardcast功能控制 ...
- vs调试c语言检查内存泄露,VisualStudio中检查内存泄露方法
项目工程中存在内存泄露,被折磨了一晚上,终于查了出来,因为之前没有相关的经验,还比较生疏,在此记录下来,方便以后查找. 对于malloc出的内存的检测方法 这篇文章中详细地记录了从检查到找到确定位置到 ...
最新文章
- nyoj239月老的难题
- 超600人!近5小时直播!录屏+彩蛋+PPT…你要的都在这!
- js设置html不可复制,用JS实现用户禁止WEB复制
- 看了还不会装系统,智商肯定不高!
- JS 日期格式和时间戳相互转化
- ueditor java_编辑器ueditor1.4.3 JAVA环境使用
- 联机侠控制台JAVA_我的世界MultiMc启动器
- jq onclick 定义_jq中的onclick绑定事件
- MySQL 8 安装教程
- 灵魂有香气的女子李筱懿|讲述女性自我成长的重要性
- mac word 复制自动产生书签
- Photoshop抠图(用调整边缘命令抠图)
- Linux 基于tar与openssl加密解密压缩包
- bom实现方块移动_HTML 方块移动
- E22-400M22S(SX1268) CubeMX HAL
- 回归基础 java基础数据 数据处理
- python import turtle as t_Python Turtle模块的简单应用
- 教 你 如 何 唱 歌
- 飞飞php影视系统漏洞,飞飞影视最新版前台无限制getshell
- AR眼镜语音转文字实测!效果像开了弹幕,对话记录可保存回溯
热门文章
- 计算机视觉及机器学习论文、源代码合集
- 【杂谈】有三AI专业版学习扑克牌上线,一副扑克,看懂AI核心技术
- 2019年有三AI“春季”划,给我一个荣耀,还你一生荣耀
- 中国溶解浆市场深度调研及投资战略决策报告2022-2028年版
- Unicode与UTF-8互转(C语言实现)
- Window 消息大全使用详解(无聊没事做)
- 拼多多谋定500个供应链品牌 农民丰收节交易会“拼农货”
- P3159 [CQOI2012]交换棋子(费用流)
- rsync+shell脚本完成自动化备份
- ALIENTEK 战舰ENC28J60 LWIP和UIP补充例程