LeakCanary——直白的展现Android中的内存泄露
之前碰到的OOM问题,终于很直白的呈现在我的眼前:我尝试了MAT,但是发现不怎么会用。直到今天终于发现了这个新工具:
当我们的App中存在内存泄露时会在通知栏弹出通知:
当点击该通知时,会跳转到具体的页面,展示出Leak的引用路径,如下图所示:
LeakCanary 可以用更加直白的方式将内存泄露展现在我们的面前。
以下是我找到的学习资料,写的非常棒:
1、LeakCanary: 让内存泄露无所遁形
2、LeakCanary 中文使用说明
AndroidStudio (官方)上使用LeakCanary 请移步:
https://github.com/square/leakcanary
Eclipse 上使用LeakCanary 请移步我的:
https://github.com/SOFTPOWER1991/LeakcanarySample-Eclipse
Android studio (自己弄的)上使用LeakCanary也可以看这个:
leakcanarySample_androidStudio
工程包括:
- LeakCanary库代码
- LeakCanaryDemo示例代码
使用步骤:
将LeakCanary import 入自己的工程
添加依赖:
compile project(':leakcanary')
在Application中进行配置
public class ExampleApplication extends Application { ...... //在自己的Application中添加如下代码 public static RefWatcher getRefWatcher(Context context) { ExampleApplication application = (ExampleApplication) context .getApplicationContext(); return application.refWatcher; } //在自己的Application中添加如下代码 private RefWatcher refWatcher; @Override public void onCreate() { super.onCreate(); ...... //在自己的Application中添加如下代码 refWatcher = LeakCanary.install(this); ...... } ..... }
在Activity中进行配置
public class MainActivity extends AppCompatActivity { ...... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //在自己的应用初始Activity中加入如下两行代码 RefWatcher refWatcher = ExampleApplication.getRefWatcher(this); refWatcher.watch(this); textView = (TextView) findViewById(R.id.tv); textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startAsyncTask(); } }); } private void async() { startAsyncTask(); } private void startAsyncTask() { // This async task is an anonymous class and therefore has a hidden reference to the outer // class MainActivity. If the activity gets destroyed before the task finishes (e.g. rotation), // the activity instance will leak. new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { // Do some slow work in background SystemClock.sleep(20000); return null; } }.execute(); } }
- 在AndroidMainfest.xml 中进行配置,添加如下代码
<serviceandroid:name="com.squareup.leakcanary.internal.HeapAnalyzerService"android:enabled="false" android:process=":leakcanary" /> <service android:name="com.squareup.leakcanary.DisplayLeakService" android:enabled="false" /> <activity android:name="com.squareup.leakcanary.internal.DisplayLeakActivity" android:enabled="false" android:icon="@drawable/__leak_canary_icon" android:label="@string/__leak_canary_display_activity_label" android:taskAffinity="com.squareup.leakcanary" android:theme="@style/__LeakCanary.Base" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
转载于:https://www.cnblogs.com/ldq2016/p/6635783.html
LeakCanary——直白的展现Android中的内存泄露相关推荐
- LeakCanary——消除Android中的内存泄露
2019独角兽企业重金招聘Python工程师标准>>> ##LeakCanary ####简介 LeakCanary是Square公司最近公布的开源项目,旨在消除Android中的内 ...
- android中内存泄露,Android中的内存泄露
编辑推荐: 本文来自于csdn,本文主要从java的内存模型讲起,最终举出几个内存泄露的例子和解决方案. java运行时内存模型 具体信息:http://gityuan.com/2016/01/09/ ...
- Android中出现内存泄露的原因
短生命周期的对象持有了长生命周期的对象,使得短生命周期对象驻留内存,消耗内存,因为无法让垃圾回收器GC验证这些对象是否不再被使用,无法释放这些内存. 以下会造成内存泄露: a.数据库的cursor没有 ...
- Android中的内存泄漏和内存溢出
一.内存泄漏 1.内存泄漏的现象和本质 内存泄漏(Memory Leak)是指某些对象已经不再使用了,但却无法被垃圾回收器回收内存,还一直占用着内存空间的现象,这就导致这一块内存泄露了. 而垃圾回收器 ...
- Android中的内存泄漏
** Android中的内存泄漏 ** Android中的内存泄漏: 概念:程序在申请内存后,当该内存不需再使用但却无法被释放 & 归还给程序的现象,对应用程序的影响,容易使得应用程序发生内存 ...
- 谈谈android中的内存泄漏
写在前面 内存泄漏实际上很多时候,对于开发者来说不容易引起重视.因为相对于crash来说,android中一两个地方发生内存泄漏的时候,对于整体没有特别严重的影响.但是我想说的是,当内存泄漏多的时候, ...
- 探究Bitmap在Android中的内存占用
一.Bitmap的内存占用检测 Bitmap 一直以来都是 Android App 的内存消耗大户,很多 Java 甚至 native 内存问题的背后都是不当持有了大量大小很大的 Bitmap,我们可 ...
- android native 代码内存泄露 定位方案
android native 代码内存泄露 定位方案 java代码的内存定位,暂时我们先不关注.此篇文章,主要围绕c c++代码的内存泄露. ** *欢迎留言,交流您所使用的内存泄露定位方案.*c ...
- Android C++ Native 内存泄露检查工具Raphael使用介绍
Android C++ Native 内存泄露检查工具使用介绍 实现原理 使用方法 Raphael添加到测试apk 添加项目依赖 同步gradle 启动泄露检测功能 直接使用boardcast功能控制 ...
最新文章
- Android 多屏显示分析
- 计算机二级办公软件aoa 百度云,计算机二级办公 考生注意事项(二级AOA)
- field property data type validation error in metadata
- Tomcat显示文件列表
- python分词训练_python练习17:用jieba分词做关键词提取,用matplotlib做可视化
- linux系统学习第六天
- 阿里云最新虚拟化研发岗招聘
- 微信小程序——仿写京东购物商城带源码
- 5款cpu温度检测工具,让你时刻关注mac的工作情况!
- :root选择器的妙用【2021.11.14】
- 3D打印机USB联机打印是如何实现的?(以Cura插件USBPrinting为例)
- centos mysql部署_CentOS下MySQL 8.0安装部署,超详细!
- 中国朝代顺序表 - 中国朝代更替表,中国历史朝代公元对照简表
- DAB-Deformable-DETR源码学习记录之模型构建(二)
- C、C++、java的区别
- 重生后发现高冷女同桌暗恋我!(二)
- 为什么程序员面试官总喜欢问你有什么技术亮点?
- 国足历届世界杯对战图关系
- 深度强化学习(DRL)一:入门篇
- Libiconv移植到Hi3536