记一次Android内存分析过程
前言
上周五的时候,祝峰找到我,反映了Android收银台买单结果页内存飙升的问题。我在自己的机器上也试着重现了一下,发现从支付台-微信支付成功并返回后,进入买单结果页的内存会突然增大,导致GC,如图(2m5s后的突然升高):

初步分析
问题可以重现,但原因是否在于结果页,仍有待商榷。出于以下两个方面考虑,我判断问题出在更前面的页面:
- 使用微信支付后,才会出现内存飙升;如果使用余额付款,一切正常;
- 结果页逻辑非常简单,并没有明显吃内存的代码。
追踪过程
首先使用AndroidStudio自带的工具将内存飙升前后两个时间点的堆dump下来,分别命名为a.hprof和b.hprof,接着使用MAT进行对比(感谢@徐帅提供的MAT包),对比前需要使用Android SDK自带的工具hprof-conv(位于platform-tools下)将dump下来的两个文件进行转换,不然MAT无法识别该文件。对比截图如下:

可以见到,第一行的byte[]对比后,b.hprof比a.hprof多占用了约8mb的空间,其余对象size差异不大,断定问题就出在这个byte数组上面。接下来分析byte[]存了什么东西,会导致吃掉8mb内存。
追踪下去后发现,多出的8mb是一个bitmap!!!如下图:

将b.hprof中多出的8mb byte[]内容拷贝到文件中,重命名为unknownimage.data,使用GIMP打开该文件,发现罪魁祸首居然是它!

明明是app启动时的欢迎界面,怎么会出现在微信支付后的返回界面?而且实际操作过程中并没有看到它的身影。没关系,代码是不会骗人的。这个图片文件的名字是ic_splash_screen,在项目中搜索后,发现在WXPayEntryActivity中有如下一段代码:

到此为止真相大白!微信支付成功/失败后回调,进入WXPayEntryActivity,这里设置了页面布局为R.layout.splash_screen_view,布局文件中用match_parent设置了背景ImageView为“吃喝玩乐,找优惠”图片,在1080p的手机上,所占空间为 1920 * 1080 * 4 byte = 8294400 byte ~= 8mb。去掉这一行后,内存曲线如下(1m15s后的略微上升):

参考
- 使用GIMP查看图片:http://stackoverflow.com/questions/12709603/mat-eclipse-memory-analyzer-how-to-view-bitmaps-from-memory-dump
- 内存分析工具MAT的使用:http://www.it165.net/pro/html/201402/9399.html
记一次Android内存分析过程的更多相关文章
- Android内存分析工具
在Android系统开发过程中,经常会要去分析进程的内存的使用情况,简单介绍下Android内存分析的相关工具. 文章参考: 1.dumpsys 2.memory-analysis-command 1 ...
- Android 内存分析工具 MAT(Memory Analyzer Tool)
如果使用DDMS确实发现了我们的程序中存在内存泄漏,那又如何定位到具体出现问题的代码片段,最终找到问题所在呢?如果从头到尾的分析代码逻辑,那肯定 会把人逼疯,特别是在维护别人写的代码的时候.这里介绍一 ...
- Android内存分析工具DDMS heap + MAT 安装和使用
一 Java内存分析工具扫盲 如果像我一样一点都不了解,可以先进行内存分析工具扫盲 MAT介绍: Eclipse Memory Analyzer(MAT)一个功能丰富的 JAVA 堆转储 ...
- Android内存分析命令(转)
一.概述 1.1 内存指标概念 Item 全称 含义 等价 USS Unique Set Size 物理内存 进程独占的内存 PSS Proportional Set Size 物理内存 PSS= U ...
- android内存分析:heap Snapshot的使用
网上有很多讲解关于android studio中memory工具的使用,接下来我来说一段在项目中发生的实例:大家可以根据我的这个方法来分析自己项目中的问题 首先我们要通过手动先触发GC操作,点击mem ...
- Android 内存分析工具 - LogCat GC
一.GC_Reason 触发垃圾回收的回收的集中原因: 类型 描述 GC_CONCURRENT 内存使用将满时,并发的进行垃圾回收. GC_FOR_MALLOC 当内存已满应用尝试分配内存时会出触发垃 ...
- Android 内存分析
1.使用adb命令查看app内存使用情况 adb shell dumpsys meminfo <package_name> adb shell top | grep <package ...
- Android内存泄漏检测利器:LeakCanary
Android内存泄漏检测利器:LeakCanary MAR 28TH, 2016 是什么? 一言以蔽之:LeakCanary是一个傻瓜化并且可视化的内存泄露分析工具 为什么需要LeakCanary? ...
- android--------Android内存分析工具的使用
内存分析(in-memory analytics)是我们编写速度快.效率高的代码必不可少的知识.如果自己编写的代码在内存的分配一无所知,我想这样的程序让你去优化,应该是无从下手的.那么内存分析是什么? ...
随机推荐
- 对HTML+CSS+JavaScript的个人理解
HTML就像人的骨头架子,是人的根基,要有个人样呀,一个网站,一个WebApp要是缺根儿骨头,那就像人少个胳膊少个腿儿的,行动不方便啊:CSS就像人穿得衣服.鞋子,男人的纹身,女人擦得粉儿,好看呀,一 ...
- C++ iostream的线程安全性问题
标准C里面的printf, fprintf之类的,会给FILE指针上锁(在unix平台上就是记录锁,按照msdn的说法windows上也有类似的锁),所以单次函数调用总是线程安全的: 要注意,这里只对 ...
- iscroll动态加载数据完美解决方案
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta charset="utf-8&quo ...
- RBL开发笔记三
2014-08-26 20:06:24 今天就是在开发这个EPOLL来处理网络事件 封装较为健壮的EPOLL模型来处理基本的网络IO 1) 超时这个主题先没有弄 在开发EPOLL包括select/po ...
- webpack脚手架搭建(简单版)
运行命令 安装依赖:npm install 运行项目:npm start 大致流程 npm init:新建 package.json 将需要的依赖模块加入 dependencies(生产环境) 和 d ...
- border-image(转载)
本文转自:http://www.zhangxinxu.com/wordpress/2010/01/css3-border-image%E8%AF%A6%E8%A7%A3%E3%80%81%E5%BA% ...
- CSS颜色代码大全
CSS颜色代码大全 转载:http://blog.163.com/wujinhongisme@126/blog/static/3613698020095115919389/ RGB ( Red,Gre ...
- java取整和java四舍五入方法 转自董俊杰
import java.math.BigDecimal; import java.text.DecimalFormat; public class TestGetInt{ public static ...
- svn服务器迁移(生成dump)
首先介绍一下dump文件 一定要进入VisualSVN服务端的安装目录里的bin目录下面,然后再执行svnadmin 相关命令. 不然会出现下图中的“svnadmin不是内部命令或外部命令,也不是可 ...
- 5X + 2Y +Z = 50 的所有非负整数解
这种题的解题方法都差不多,不停的循环,不过如果做一下细分,效率应该可以提升很多,下面把最常规效率也最低的代码贴上,有时间再优化 #include <iostream> using name ...