记一次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)是我们编写速度快.效率高的代码必不可少的知识.如果自己编写的代码在内存的分配一无所知,我想这样的程序让你去优化,应该是无从下手的.那么内存分析是什么? ...
 
随机推荐
- MATLAB 例子研究   Motion-Based Multiple Object Tracking
			
这个例子是用来识别视频中多个物体运动的.我要研究的是:搞清楚识别的步骤和相应的算法,识别出物体运动的轨迹. 详细参见官方帮助文档,总结如下: 移动物体的识别算法:a background subtra ...
 - 手把手教你用python抓网页数据
			
http://www.1point3acres.com/bbs/thread-83337-1-1.html
 - hehe
			
with wares as ( SELECT distinct a.Wid as wid, a.Wname as wareName, a. ...
 - GSM模块fibocom G510使用记录
			
一、背景:最近在做一个单定位的产品,对低功耗要求较高,选用了G510系列的模块。现在仅做了三块样板,先熟悉下。 二、优点:1.功耗低,和西门子的BGS2差不多;2.注册网络指令简单;3.其他有待发现 ...
 - 使用UISegmentedControl的一个注意事项
			
NSArray* array = [[NSArray alloc]initWithObjects:@"机会",@"联系人", nil]; //先确定segmen ...
 - 常用IT类英文词汇 - 1
			
作为IT学生以及将来打算从事IT行业的人, 我们在开发时少不了要去阅读英文文档, 在面试及工作中也会涉及到相关的英文词汇, 因此具备一定的英语水准是必须的. 这里我就把我在学习中所遇到的英文词汇记录下 ...
 - sqoop的export导入到oracle中
 - jsp连接mysql数据库
			
1.新建一个Java web项目. 2.导入mysql驱动包.(这个跟上一篇写的Java连接mysql类似) 3.编写测试代码 <%@ page contentType="text/h ...
 - 2015GitWebRTC编译实录12
			
2015.07.20 libjingle_peerconnection 编译通过[1382/1600 ] CXX obj/talk/app /webrtc/libjingle_peerconnecti ...
 - 关于配置服务器(IIS7)
			
服务器Server2003 ,无限开机动画慢动作重播,一怒而重装server2008 然,重点就是系统装好了 IIS装好了 ,发布网站 开始各种错了!!! 1.第一个错 额,错误信息说 :由于权限不足 ...