之前碰到的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

工程包括:

  1. LeakCanary库代码
  2. LeakCanaryDemo示例代码

使用步骤:

  1. 将LeakCanary import 入自己的工程

  2. 添加依赖:

    compile project(':leakcanary')

  3. 在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);
    ......
    } .....
    }
  4. 在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();
} }
  1. 在AndroidMainfest.xml 中进行配置,添加如下代码
        <service
android: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>

5、测试结果

a、Toast显示(大概10秒左右显示)

b、通知显示

c、桌面自动添加的图表

d、内存泄露列表

e、内存泄露详细

LogCat可以看到日志日下(hprof文件可以用MAT打开进行分析):

  1. 01-04 11:49:41.815 12967-13004/com.micky.leakcanarysamples I/dalvikvm: hprof: dumping heap strings to "/storage/emulated/0/Download/leakcanary/suspected_leak_heapdump.hprof".
  2. 01-04 11:49:42.020 12967-13004/com.micky.leakcanarysamples I/dalvikvm: hprof: heap dump completed (28850KB)

查看自动生成的AndroidManifest文件,LeakCanarySamples/app/build/intermediates/manifests/full/debug/AndroidManifest.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.micky.leakcanarysamples"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6. <uses-sdk
  7. android:minSdkVersion="10"
  8. android:targetSdkVersion="23" />
  9. <!-- To store the heap dumps and leak analysis results. -->
  10. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  11. <android:uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  12. <application
  13. android:name="com.micky.leakcanarysamples.BaseApplication"
  14. android:allowBackup="true"
  15. android:icon="@mipmap/ic_launcher"
  16. android:label="@string/app_name"
  17. android:supportsRtl="true"
  18. android:theme="@style/AppTheme" >
  19. <activity
  20. android:name="com.micky.leakcanarysamples.MainActivity"
  21. android:label="@string/app_name"
  22. android:theme="@style/AppTheme.NoActionBar" >
  23. <intent-filter>
  24. <action android:name="android.intent.action.MAIN" />
  25. <category android:name="android.intent.category.LAUNCHER" />
  26. </intent-filter>
  27. </activity>
  28. <activity android:name="com.micky.leakcanarysamples.TestActivity" />
  29. <service
  30. android:name="com.squareup.leakcanary.internal.HeapAnalyzerService"
  31. android:enabled="false"
  32. android:process=":leakcanary" />
  33. <service
  34. android:name="com.squareup.leakcanary.DisplayLeakService"
  35. android:enabled="false" />
  36. <activity
  37. android:name="com.squareup.leakcanary.internal.DisplayLeakActivity"
  38. android:enabled="false"
  39. android:icon="@drawable/__leak_canary_icon"
  40. android:label="@string/__leak_canary_display_activity_label"
  41. android:taskAffinity="com.squareup.leakcanary"
  42. android:theme="@style/__LeakCanary.Base" >
  43. <intent-filter>
  44. <action android:name="android.intent.action.MAIN" />
  45. <category android:name="android.intent.category.LAUNCHER" />
  46. </intent-filter>
  47. </activity>
  48. </application>
  49. </manifest>

如上所示LeakCanary给我们自动添加了两个Service和一个Activity,并添加了对SD卡的读写权限



It 's so simple.

注:

1、如果在Release模式下请使用RefWatcher.DISABLED

2、在Activity或Fragment 的 Destroy方法中添加检测(很好理解,就是判断一个Activity或Fragment想要被销毁的时候,是否还有其他对象持有其引用导致Activity或Fragment不能被回收,从而导致内存泄露)

Android内存优化8 内存检测工具2 LeakCanary——直白的展现Android中的内存泄露的更多相关文章

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

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

  2. 56、LeakCanary——直白的展现Android中的内存泄露

    转载:http://blog.csdn.net/watermusicyes/article/details/46333925 DEMO下载地址:https://github.com/SOFTPOWER ...

  3. Linux内存都去哪了:(1)分析memblock在启动过程中对内存的影响

    关键词:memblock.totalram_pages.meminfo.MemTotal.CMA等. 最近在做低成本方案,需要研究一整块RAM都用在哪里了? 最直观的的就是通过/proc/meminf ...

  4. Android 性能优化 五 性能分析工具dumpsys的使用

    Android提供的dumpsys工具能够用于查看感兴趣的系统服务信息与状态,手机连接电脑后能够直接命令行运行adb shell dumpsys 查看全部支持的Service可是这样输出的太多,能够通 ...

  5. Android应用优化之代码检测优化

    在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packe ...

  6. Android内存泄漏检测利器:LeakCanary

    Android内存泄漏检测利器:LeakCanary MAR 28TH, 2016 是什么? 一言以蔽之:LeakCanary是一个傻瓜化并且可视化的内存泄露分析工具 为什么需要LeakCanary? ...

  7. 【腾讯Bugly干货分享】Android内存优化总结&实践

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/2MsEAR9pQfMr1Sfs7cPdWQ 导语 智 ...

  8. Android性能优化-内存优化

    原文链接 Manage Your App’s Memory 前言 在任何软件开发环境中,RAM都是比较珍贵的资源.在移动操作系统上更是这样,因为它们的物理内存通常受限.尽管在ART和Dalvik虚拟机 ...

  9. 大礼包!ANDROID内存优化(大汇总)

    写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上把网上搜集的各种内存零散知识点进行汇总.挑选.简化后整理而成. 所以我将本文定义为一个工具类的文章,如果你在A ...

随机推荐

  1. 【python】r+,w+ 全局变量

    来源:http://www.educity.cn/wenda/352188.html r+:可读可写,若文件不存在,报错w+: 可读可写,若文件不存在,创建文本模式:遇换行符时根据操作系统不同自动转换 ...

  2. LockSupport学习

    LockSupport工具类定义了一组的公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能.Java锁和同步器框架的核心工具类AQS:AbstractQueueSynchronizer,就是通过调 ...

  3. java 内部类和静态内部类的区别

    private class InnerClass {        // 只有在静态内部类中才能够声明或定义静态成员        // private static String tt = &quo ...

  4. node-session

    session cookie 虽然很方便,但是使用 cookie 有一个很大的弊端,cookie 中的所有数据在客户端就可以被修改,数据非常容易被伪造,那么一些重要的数据就不能存放在 cookie 中 ...

  5. LeetCode解题报告—— Trapping Rain Water

    Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...

  6. OpenCL与CUDA,CPU与GPU

    OpenCL OpenCL(全称Open Computing Language,开放运算语言)是第一个面向异构系统通用目的并行编程的开放式.免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计 ...

  7. git在window与linux的换行符问题

    1:背景.我win7,后端是win10,使用了TortoiseGit工具.我使用ssh,他使用http.仓库是在linux,使用gitLab管理 2:问题.仓库是总监之前建好的.后端把文件add后pu ...

  8. AC日记——「SCOI2015」情报传递 LiBreOJ 2011

    #2011. 「SCOI2015」情报传递 思路: 可持久化树状数组模板: 代码: #include <bits/stdc++.h> using namespace std; #defin ...

  9. NET牛人应该知道些什么?(瞬间觉得自己弱爆了)

    任何一个使用.NET的人 描述线程与进程的区别? 什么是Windows服务,它的生命周期与标准的EXE程序有什么不同 Windows上的单个进程所能访问的最大内存量是多少?它与系统的最大虚拟内存一样吗 ...

  10. 网站页面SEO的三个标签怎么写有利【转载】

    转载自:代明博客 在SEO界,自从夫唯老师提出“四处一词”的概念以来,不管是搜索引擎还是SEOer,都格外重视页面的三个标签.三个标签书写是否成功,在很大程度上决定了网页是否能有好的排名.今天代明博客 ...