开篇之前,我们要先理解:什么是内存泄漏。
百度百科:内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
内存泄漏的影响上面也说的很清楚了,所以我们需要发现内存泄漏,并解决内存泄漏。

在Android中,要如何发现内存泄漏呢?
我目前有用到两种方法,第一种是用Android Studio,这个方法可以检测Activity的内存泄漏;第二种是使用LeakCanary,可以检测所有内存泄漏。

第一种方法:
我目前用的是Android Studio,Android Studio有一个自带的检测内存泄漏的方法。
首先,打开Monitor界面:

Monitor界面.png

然后,打开APP,测试APP有内存泄漏嫌疑的界面,点击下图按钮,强制GC:

强制GC.png

接下来,点击下图所示按钮,进入HPROF Viewer界面,查看Java的Heap:

点击按钮,进入HPROF Viewer界面.png

HPROF Viewer界面.png

然后,点击上图所示的“Analyzer Tasks”按钮,打开Analyzer Tasks界面:

Analyzer Tasks界面.png

点击上图所示按钮,开始分析内存泄漏,结果如下图所示:

内存泄漏分析结果.png

如上图所示,出现了两个内存泄漏,可以根据箭头所指区域的信息修改内存泄漏问题。

第二种方法:
LeakCanary是一个开源的在debug版本中检测内存泄漏的java库。
GitHub地址为:https://github.com/square/leakcanary
根据GitHub上的说明文档,集成LeakCanary:
在app的build.gradle中,加入以下代码:

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

在自定义Application中加入以下代码:

public class ExampleApplication extends Application {

  @Override public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
// This process is dedicated to LeakCanary for heap analysis.
// You should not init your app in this process.
return;
}
LeakCanary.install(this);
// Normal app init code...
}
}

然后,就可以直接使用了。
LeakCanary除了会在界面中显示泄漏信息之外,Log中也一样会输出泄漏的具体信息。我们可以根据这些信息解决内存泄漏问题。

Android之内存泄漏的更多相关文章

  1. 利用Android Studio、MAT对Android进行内存泄漏检测

    利用Android Studio.MAT对Android进行内存泄漏检测 Android开发中难免会遇到各种内存泄漏,如果不及时发现处理,会导致出现内存越用越大,可能会因为内存泄漏导致出现各种奇怪的c ...

  2. Android防止内存泄漏以及MAT的使用

    Android发生内存泄漏最普遍的一种情况就是长期保持对Context,特别是Activity的引用,使得Activity无法被销毁.这也就意味着Activity中所有的成员变量也没办法销毁.本文仅介 ...

  3. android性能测试内存泄漏

    1.什么是内存泄漏?     适用于该系统的内存使用内存泄漏,未回复(释放),该内存可以没有事业,也不能被其他人使用使用自己. 2.出有什么差别?    内存泄漏是分配出去的内存无法回收.    内存 ...

  4. android 常见内存泄漏原因及解决办法

    android常见内存泄漏主要有以下几类: 一.Handler 引起的内存泄漏. 在Android开发中,我们经常会使用Handler来控制主线程UI程序的界面变化,使用非常简单方便,但是稍不注意,很 ...

  5. [原理] Android Native内存泄漏检测原理解析

    转载请注明出处:https://www.cnblogs.com/zzcperf/articles/11615655.html 上一篇文章列举了不同版本Android OS内存泄漏的检测操作(传送门), ...

  6. Android应用内存泄漏的定位、分析与解决策略

    什么是内存泄漏 对于不同的语言平台来说,进行标记回收内存的算法是不一样的,像 Android(Java)则采用 GC-Root 的标记回收算法.下面这张图就展示了 Android 内存的回收管理策略( ...

  7. [轉]Android的内存泄漏和调试

    一. Android的内存机制 Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似.程序员通过new为对象分配内存,所有对象在java堆内分配空间:然而对象的 ...

  8. 【转】Android之内存泄漏调试学习与总结

    大家有或经常碰到OOM的问题,对吧?很多这样的问题只要一出现相信大家的想法跟小马的一样,就是自己的应用:优化.优化.再优化!而且如果出现类似于OOM这样级别的问题,根本就不好处理,LogCat日志中显 ...

  9. Android 常见内存泄漏的解决方式

    在Android程序开发中.当一个对象已经不须要再使用了,本该被回收时.而另外一个正在使用的对象持有它的引用从而导致它不能被回收.这就导致本该被回收的对象不能被回收而停留在堆内存中,内存泄漏就产生了. ...

随机推荐

  1. Typecho 插件开发基础

    <?php /** * 标题 插件说明 * * @package 添加标题 * @author Fan * @version 1.0.0 * @link http://cnblogs.com/f ...

  2. Spring通过注解配置Bean

    @Component: 基本注解, 标识了一个受 Spring 管理的组件@Repository: 标识持久层组件@Service: 标识服务层(业务层)组件@Controller: 标识表现层组件 ...

  3. 记录:CSS特殊性——权值规则

    浏览器是根据权值来判断使用哪种css样式的,权值高的就使用哪种css样式. 下面是权值的规则: 标签的权值为1,类选择符的权值为10,ID选择符的权值最高为100.例如下面的代码: p{color:r ...

  4. WMS和WMTS的区别

  5. kepware http接口 nodejs开发

    读取某变量的值(native var http = require("http"); var options = { "method": "GET&q ...

  6. Spring AOP 中pointcut expression表达式

    原文地址——http://blog.csdn.net/qq525099302/article/details/53996344 Pointcut是指那些方法需要被执行”AOP”,是由”Pointcut ...

  7. unigui作中间件使用

    unigui作中间件使用 可返回string或者tstream数据. 如果返回JSON字符,则UNIGUI就是REST 中间件. procedure TUniServerModule.UniGUISe ...

  8. unidbgrid显示列的合计值

    procedure TfrmClient.UniDBGrid1ColumnSummaryResult(Column: TUniDBGridColumn; GroupFieldValue: Varian ...

  9. lnmp mysql添加用户命令

    cd /usr/local/mysql/bin/grant all privileges on *.* to 'root'@'%' identified by '12345678';flush pri ...

  10. MySQL--binlog和relay log的生成和删除

    ##================================================================================================== ...