记一次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)是我们编写速度快.效率高的代码必不可少的知识.如果自己编写的代码在内存的分配一无所知,我想这样的程序让你去优化,应该是无从下手的.那么内存分析是什么? ...
随机推荐
- IDH2.5.1. Pain Points
1. On Redhat 6.2 after uninstalling a cluster, and re-install IDH 2.5.1, you meet a "can not wr ...
- GFT_News Auto
using AnfleCrawler.Common; using Newtonsoft.Json.Linq; using System; using System.Collections.Generi ...
- sqoop的命令行操作
- init.sh 学习(转
cd /mnt insmod ss_triger_drv.ko insmod ss_led_alarm_drv.ko insmod ss_img_prc_drv.ko insmod ss_post_i ...
- Swift的文档注释
官方文档地址:https://developer.apple.com/library/mac/documentation/Xcode/Reference/xcode_markup_formatting ...
- linux系统下php安装mbstring扩展的二种方法
.执行 复制代码代码如下: yum install php-mbstring 2. 修改php.ini (这一步非常重要, 部分lxadmin版本无法自动修改) 复制代码代码如下: echo ‘ext ...
- 线程和NSThread 、 NSOperation
1 使用NSThread实现打地鼠 1.1 问题 NSThread是ios提供的轻量级的多线程解决方案,但是需要自己管理线程的生命周期.线程同步等.本案例使用NSThread实现一个打地鼠的小游戏,在 ...
- C++学习笔记23:库
静态库(Archives) 后缀一般为"*.a" 使用两个目标文件创建单一静态库的编译与链接命令:ar cr libtest.a test1.o test2.o 链接器搜索静态库 ...
- 关于 Unix 用户权限及进程权限及 Saved set-user-id
最近在看APUE,看到3.14节,fcntl的时候#include <fcntl.h>int fcntl(int fd, int cmd, .../* int arg */);出错返回-1 ...
- charles 结合mocky 模拟数据
重定向(模拟造数据) 例如:E代送商户端订单列表,模拟99+订单 接口:http://api.edaisong.com/20151022/order/consigneeaddressb 打开http: ...