AndroidStudio 内存泄漏的分析过程
前言部分
这次泄漏是自己代码写的太随意引起的,讲道理,代码写的太为所欲为了,导致有些问题根本就很难发现。
泄漏产生的原因,由于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 内存泄漏的分析过程的更多相关文章
- JVisualVM简介与内存泄漏实战分析
JVisualVM简介与内存泄漏实战分析 学习了:https://blog.csdn.net/kl28978113/article/details/53817827
- AndroidStudio 内存泄漏分析 Memory Monitor
ok.写一段内存泄漏的code private TextView txt; @Override protected void onCreate(Bundle savedInstanceState) { ...
- Day 18: 记filebeat内存泄漏问题分析及调优
ELK 从发布5.0之后加入了beats套件之后,就改名叫做elastic stack了.beats是一组轻量级的软件,给我们提供了简便,快捷的方式来实时收集.丰富更多的数据用以支撑我们的分析.但由于 ...
- Yii2 框架跑脚本时内存泄漏问题分析
现象 在跑 edu_ocr_img 表的归档时,每跑几万个数据,都会报一次内存耗尽 PHP Fatal error: Allowed memory size of 134217728 bytesex ...
- Linux高级调试与优化——内存泄漏实战分析
最近在整理Linux调试方面的文档,正好碰到了一个内存泄漏踩栈的问题,借此机会记录一下分析过程. 首先,发现问题之后,赶紧看一下产生coredump文件没有,果不其然,产生了coredump,果断上g ...
- Java内存泄漏及分析
对于内存泄漏,首先想到的是C语言,其实不然,java中也有各种的内存泄漏.对于java程序员,在虚拟即中,不需要为每一个新建对象去delete/free内存,不容易出现内存泄漏.但是,正 是由于这种机 ...
- JVisualVM 模拟一次内存泄漏场景分析
首先贴一段内存泄漏的代码并且执行.(内存泄漏:GC回收不掉的实例对象) package com.example.demo.memoryLeakDemo; import com.example.demo ...
- iis站点内存泄漏问题分析
在一次上线过程中iis内存飙升,随后跟运维要到站点的dump文件,使用windbg分析了clr的内存分配,找到了问题的症结,先记录如下: 使用windbg加载dump文件 1.打开windbg,Fil ...
- 记一次内存泄漏DUMP分析
自从进入一家创业公司以后,逐渐忙成狗,却无所收获,感觉自身的技术能力用武之地很少,工作生活都在业务逻辑中颠倒. 前些天线上服务内存吃紧,让运维把DUMP拿下来,分析一下聊以自慰. 先来统计一下大对象信 ...
随机推荐
- Blue Jeans POJ 3080 寻找多个串的最长相同子串
Description The Genographic Project is a research partnership between IBM and The National Geographi ...
- [bzoj2654]tree_二分_kruskal
tree bzoj-2654 题目大意:给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树.题目保证有解. 注释:$1\le V\le 5\cdot 10^4 ...
- bootstrap-table与Spring项目集成实例收集
bootstrap-table项目官网:https://github.com/wenzhixin/bootstrap-table bootstrap-table各版本下载:https://github ...
- iOS:改变UITableViewCell的选中背景色
要改变UITableViewCell选中时的背景色,需要在-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtInde ...
- shell中eval命令
原文:http://www.cnblogs.com/xdzone/archive/2011/03/15/1984971.html 语法:eval cmdLine eval会对后面的cmdLine进行两 ...
- Zend_Form 创建、校验和解析表单的基础--(手冊)
1. 创建表单对象 创建表单对象很easy:仅仅要实现 Zend_Form: <?php $form = newZend_Form; ? > 对于高级用例.须要创建 Zend_Form ...
- lzugis——Arcgis Server for JavaScript API之自己定义InfoWindow
用过Arcgis Server for JavaScript API肯定知道InfoWIndow.你在用InfoWindow的时候会发现各种问题,比如不能全然显示的问题,遮盖对象的问题等等.所以呢我在 ...
- zoj 1648 Circuit Board
题目:意思就是推断给定的几条线段是否有相交的. 方法:模版吧,有空在来细细学习. 代码: #include <iostream> #include <cstdio> using ...
- 【POJ 1201】 Intervals(差分约束系统)
[POJ 1201] Intervals(差分约束系统) 11 1716的升级版 把原本固定的边权改为不固定. Intervals Time Limit: 2000MS Memory Limit: ...
- SQL server触发器、存储过程操作远程数据库插入数据,解决服务器已存在的问题
近期弄了一个小项目,也不是非常复杂,须要将一个数据库的一些数据备份到另外一个库.不是本地,可能是网络上其它的数据库.想了一下,用了存储过程和触发器. 也不是非常复杂,首先我须要操作远程数据库,于是写了 ...