前言部分
这次泄漏是自己代码写的太随意引起的,讲道理,代码写的太为所欲为了,导致有些问题根本就很难发现。

泄漏产生的原因,由于activity未被回收导致。这里给我们提出的一个警示,在使用上下文的时候,我们要特别注意,尤其是一些实例的上下文,如:activity、fragment等。

这次的错误原因就是我把activity作为上下文传给了Glide使用,结果后期我做夜间模式,需要重启activity让夜间模式生效的时候忘记Glide还在持有activity的引用导致了泄漏。

内容部分
产生了泄漏的时候我们需要一些分析工具,leakcanary算是一个必备工具了。我们通过leakcanary可以收集到app产生的泄漏信息,然后通过信息可以找到具体的类,定位到泄漏的类中,在顺着引用连接就可以找到了。下面看一个泄漏的图:

上图中可以看出一些重要信息:
MainActivity的实例发生了泄漏,这表明我们的MainActivity在实例销毁的时候由于被Glide引用,并没有被回收。

导致这个结果的原因就是下面这段代码:

Glide.with(this@MainActivity)
.load(R.drawable.head_photo)
.apply(RequestOptions.bitmapTransform(CircleCrop()))
.into(ivPersonPhoto!!)
1
2
3
4
这里传入Glide中的上下文我没有使用applicationContext,结果在启用夜间模式的时候进行重启activity的时候出现了泄漏。

一些简单的泄漏通过leakcanary帮助我们收集的信息是可以处理的。但是如果有很多地方都引用一个实例的话,我们就需要使用一下分析工具了。

下面我们来看一下如何通过studio查看泄漏的步骤
我们先通过操作产生泄漏,这个时候我们的内存已经出现了泄漏。
然后点击Profile如图:
下面我们手动触发GC来回收无用的内存。如图:
然后内存不在减少后我们点击一下小垃圾桶旁边的箭头。就可以获取到内存的情况了。
我们点击MainActivity这个类,在右侧我们发现有两个对象在内存中。
点击后发现MainActivity被GlideRequests引用。如图

上面基本定位完成,这里我们在去找Glide引用MainActivity的地方就可以了。

上面讲的其实不太实用,因为实在通过leakcanary中确定MainActivity发生了泄漏,然后去直接去找的MainActivity,并且找到了Glide引用了MainActivity的实例才能顺利解决。

实际场景中还有很多复杂的内容,比如我的MainActivity可能被很多地方引用,找起来还是很麻烦的。所以这篇文章也只是最简单的应用。就像以前我写的查找应用超时的问题一样,基本也是找到trace文件,在里面找到自己项目相关的代码,在进行定位(猜测)。

结语部分
很多人都会问怎么进行内存泄漏的排查,其实我觉得更多的还是看经验了。因为有些泄漏真的是很难发现,如果是偶然才会发生的泄漏,那就真的更难查找了。
---------------------

AndroidStudio 内存泄漏的分析过程的更多相关文章

  1. JVisualVM简介与内存泄漏实战分析

    JVisualVM简介与内存泄漏实战分析 学习了:https://blog.csdn.net/kl28978113/article/details/53817827

  2. AndroidStudio 内存泄漏分析 Memory Monitor

    ok.写一段内存泄漏的code private TextView txt; @Override protected void onCreate(Bundle savedInstanceState) { ...

  3. Day 18: 记filebeat内存泄漏问题分析及调优

    ELK 从发布5.0之后加入了beats套件之后,就改名叫做elastic stack了.beats是一组轻量级的软件,给我们提供了简便,快捷的方式来实时收集.丰富更多的数据用以支撑我们的分析.但由于 ...

  4. Yii2 框架跑脚本时内存泄漏问题分析

    现象 在跑 edu_ocr_img 表的归档时,每跑几万个数据,都会报一次内存耗尽 PHP Fatal error:  Allowed memory size of 134217728 bytesex ...

  5. Linux高级调试与优化——内存泄漏实战分析

    最近在整理Linux调试方面的文档,正好碰到了一个内存泄漏踩栈的问题,借此机会记录一下分析过程. 首先,发现问题之后,赶紧看一下产生coredump文件没有,果不其然,产生了coredump,果断上g ...

  6. Java内存泄漏及分析

    对于内存泄漏,首先想到的是C语言,其实不然,java中也有各种的内存泄漏.对于java程序员,在虚拟即中,不需要为每一个新建对象去delete/free内存,不容易出现内存泄漏.但是,正 是由于这种机 ...

  7. JVisualVM 模拟一次内存泄漏场景分析

    首先贴一段内存泄漏的代码并且执行.(内存泄漏:GC回收不掉的实例对象) package com.example.demo.memoryLeakDemo; import com.example.demo ...

  8. iis站点内存泄漏问题分析

    在一次上线过程中iis内存飙升,随后跟运维要到站点的dump文件,使用windbg分析了clr的内存分配,找到了问题的症结,先记录如下: 使用windbg加载dump文件 1.打开windbg,Fil ...

  9. 记一次内存泄漏DUMP分析

    自从进入一家创业公司以后,逐渐忙成狗,却无所收获,感觉自身的技术能力用武之地很少,工作生活都在业务逻辑中颠倒. 前些天线上服务内存吃紧,让运维把DUMP拿下来,分析一下聊以自慰. 先来统计一下大对象信 ...

随机推荐

  1. [cogs396] [网络流24题#4] 魔术球 [网络流,最大流,最小路径覆盖]

    本题枚举每多一个球需要多少个柱子,可以边加边边计算,每次只需要判断$i-Dinic()$即可:特别注意边界. #include <iostream> #include <algori ...

  2. N天学习一个linux命令之xargs

    用途 标准输入流读取参数(空格或者换行符分隔),传递给需要执行的命令 用法 xargs [options] [command [initial-arguments]] 常用选项 --arg-file= ...

  3. Java 递归、尾递归、非递归、栈 处理 三角数问题

    import java.io.BufferedReader; import java.io.InputStreamReader; //1,3,6,10,15...n 三角数 /* * # 1 * ## ...

  4. Google Deepmind AI tries it hand at creating Hearthstone and Magic: The Gathering cards

    http://www.techrepublic.com/article/google-deepmind-ai-tries-it-hand-at-creating-hearthstone-magic-t ...

  5. P1850 换教室 概率dp

    其实说是概率dp,本质上和dp没什么区别,就是把所有可能转移的情况全枚举一下就行了,不过dp方程确实有点长... ps:这个题的floyed我竟然之前写跪了... 题目: 题目描述 对于刚上大学的牛牛 ...

  6. bzoj 1026 [ SCOI2009 ] windy数 —— 数位DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1026 蛮简单的数位DP,预处理 f[i][j] 表示 i 位数,以 j 开头的 windy ...

  7. 如何在ashx处理页中获取Session值

    本文章摘自:http://www.cnblogs.com/vihone/archive/2010/06/04/1751490.html 在一般事务处理页面,可以轻松的得到 Request,Respon ...

  8. 【K8s】Kubernetes架构理解

    抽空学习了一下Kubernetes,感觉和大数据领域内集群的资源管理.任务调度等有异曲同工之处,简单总结一下备忘. [概念] Kubernetes是一个工业级的容器编排平台,单词有点长,常用K8s代称 ...

  9. 汇编程序10:计算长度为C字节的数据和

    assume cs:code code segment mov ax,0ffffh //起始段地址 mov ds,ax mov bx,0 //偏移变量 mov dx,0 //保存结果 mov cx,1 ...

  10. golang闭包,传统斐波那契

    package main import (    "fmt") func main() {    f := fibonacci()    for i := 0; i < 10 ...