【android】通过leakCanary找出程序内存泄露点
背景
内存泄露是咱新手比较头痛的问题,因为它不像崩溃,在开发环境可以根据提示的错误信息排查问题。
你都不知道咱的app是否哪个犄角旮旯藏着一个吞噬内存的黑洞。
排查android 内存泄露比较底层高端的做法:使用官方的内存分析工具(MAT), 比较好的两篇入门文章:(一) 和 (二)

然而这个过程比较考验耐心,
咱新手也可以选择另外一款App的插件leakcanary,集成了这个插件,我们在使用app的时候,遇到内存泄露点,它就会弹出通知,并告知泄漏点(release下不会弹框)。
实战
咱们就用自己做的博客园app客户端来测试内存泄露的问题。
1:集成leakCanary
1.1:build.gradle里面:
dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1'
}
1.2:Application父类的onCreate方法中添加:
@Override
public void onCreate() {
super.onCreate();
LeakCanary.install(this);
}
1.3:准备工作已经完毕
接下来就是使用App,遇到内存泄漏,leakCanary会自动在手机里创建一个app来描述泄漏信息
2:测试内存泄露
我们的程序被测出了一个泄漏点,打开桌面如下图标

leakCanary对内存泄露的描述、引用链非常详细;这样人性化的提示信息,能非常快的定位问题所在

观察提示信息,我们发现出现这个问题的原因还是因为匿名类隐式引用Activity,导致Activity回收不掉。出现问题的地方:
mWebView.setOnScrollListener(new ScrollWebView.OnScrollListener() {
@Override
public void onScroll(int x, int y) {
switchActionBar(y - mPreviousYPos);
mPreviousYPos = y;
}
});
这个泄漏点的解决之道有很多,在回收的时候,只要确保该Activity没被其他对象持有强引用就好了。
咱的解决之道是使用弱引用,这样调用者就不用关心强引用可能导致的内存泄露的问题了。
package zhexian.learn.cnblogs.ui; import android.content.Context;
import android.util.AttributeSet;
import android.webkit.WebView; import java.lang.ref.WeakReference; /**
* 可以滚动的webView
*/
public class ScrollWebView extends WebView {
private WeakReference<OnScrollListener> mOnScrollListener; public ScrollWebView(final Context context) {
super(context);
} public ScrollWebView(final Context context, final AttributeSet attrs) {
super(context, attrs);
} public ScrollWebView(final Context context, final AttributeSet attrs, final int defStyle) {
super(context, attrs, defStyle);
} @Override
protected void onScrollChanged(final int l, final int t, final int oldl, final int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
OnScrollListener listener = mOnScrollListener.get(); if (listener != null)
listener.onScroll(l, t);
} public void setOnScrollListener(final OnScrollListener onScrollListener) {
mOnScrollListener =new WeakReference<>(onScrollListener) ;
} public interface OnScrollListener {
void onScroll(int x, int y);
}
}
【android】通过leakCanary找出程序内存泄露点的更多相关文章
- 如何快速定位找出SEGV内存错误的程序Bug
通过查看php日志/usr/local/php/var/log/php-fpm.log,有如下警告信息: [16-Mar-2015 16:03:09] WARNING: [pool www] chil ...
- 找出程序GasMileage中的哪一行与下列叙述相对应:
找出程序GasMileage中的哪一行与下列叙述相对应: a.通知程序将使用Scanner类 import java.util.Scannner; b.创建一个Scanner类的对象 Scan ...
- 用windbg+sos找出程序中谁占用内存过高,谁占用CPU过高(转载)
原文地址: http://www.cnblogs.com/Lawson/archive/2011/01/23/1942692.html 很早看到windbg+sos方面的知识,一直没仔细学习,也许因为 ...
- 找出程序cpu使用率高的原因
确定是CPU过高 使用top观察是否存在CPU使用率过高现象 找出线程 对CPU使用率过高的进程的所有线程进行排序 ps H -e -o pid,tid,pcpu,cmd --sort=pcpu |g ...
- 利用WinDbg找出程序崩溃的代码行号
之前碰到论坛里有几个好友,说程序不时的崩溃,什么xxoo不能read的! 如果光要是这个内存地址,估计你会疯掉~~ 所以分享一下基本的调试技巧,需要准备的工具有WinDbg + VC6.0, 下面是自 ...
- Linux下找出吃内存的方法总结
Linux下查询进程占用的内存方法总结,假设现在有一个「php-cgi」的进程 ,进程id为「25282」. 现在想要查询该进程占用的内存大小.linux命令行下有很多的工具进行查看,现总结常见的几种 ...
- Linux中找出占用内存最多的前N个进程
一.使用ps命令 ps -aux | sort -k4nr | head -N *命令详解: 1. head:-N可以指定显示的行数,默认显示10行. 2. ps:参数a指代all——所有的进程,u指 ...
- Android Studio中找出不再使用的资源
顶部Analyze菜单中选择Run Inspection by Name 在弹出的输入框中输入unused resources
- 面试题:在一个文件中有 10G 个整数,乱序排列,要求找出中位数(内存限制为2G)
假设整数为32bit,4个字节存储 这种题目,首先想到的是分而治之.将文件中数字分组.然后遍历文件中的数字,按分组进行计数.最后找到中位数所在的分组区间 1.如果10G个整数都为同一个,那么10G整数 ...
随机推荐
- 剑指 offer set 22 数组中的逆序数
总结 1. 题目为归并排序的变形, 不过我完全没想到 2. 在归并排序进行字符组 merge 时, 统计逆序数. merge 后, 两个子数组是有序的了, 下次再 merge 的时候就能以 o(n) ...
- linux C之alarm函数 转
原文出处:http://blog.sina.com.cn/s/blog_6a1837e90100uhl3.html alarm也称为闹钟函数,alarm()用来设置信号SIGALRM在经过参数seco ...
- Linux命令之乐--test
官方文档: help test File operators: -a FILE True if file exists. -b FILE True if file is block special. ...
- uilabel 和uitextview 自适应大小
本文转载至 http://blog.csdn.net/liulichao20/article/details/8957752 分类: ios2013-05-21 22:06 321人阅读 评论(0) ...
- Zabbix-3.0.3实现微信(WeChat)告警
导读 Zabbix可以通过多种方式把告警信息发送到指定人,常用的有邮件,短信报警方式,但是越来越多的企业开始使用zabbix结合微信作为主要的告警方式,这样可以及时有效的把告警信息推送到接收人,方便告 ...
- 微软发布新版 Skype Linux 客户端
导读 前两天,微软说要给Linux 用户带来一个令人兴奋的新闻,今天,这个新闻来了.它刚刚为 Linux 发布了一个新的 Skype 客户端.此次发布,微软为 Linux 带来的 Skype 客户端与 ...
- dubbo项目实战代码展示
最近公司项目使用dubbo服务,于是就去网上搜索关于dubbo的相关资料,真的很多,但是对于很多人并不是很了解框架或者 不是太适合新手的片段代码,于是我就根据项目的相关内容把dubbo部分单独切出来, ...
- LeetCode-Combination Sum IV
Given an integer array with all positive numbers and no duplicates, find the number of possible comb ...
- css3 transform 让 font-size 小于 12px
做页面的时候,看到一个地方要求 font-size:8px ,测试了下,浏览器果然不支持,^_^,然后就想怎么办,理所当然的掉进了 -webkit-text-size-adjust:none; 的坑, ...
- 通过Nginx反向代理实现IP分流
通过Nginx做反向代理来实现分流,以减轻服务器的负载和压力是比较常见的一种服务器部署架构.本文将分享一个如何根据来路IP来进行分流的方法. 根据特定IP来实现分流 将IP地址的最后一段最后一位为0或 ...