前言

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

初步分析

  问题可以重现,但原因是否在于结果页,仍有待商榷。出于以下两个方面考虑,我判断问题出在更前面的页面

  1. 使用微信支付后,才会出现内存飙升;如果使用余额付款,一切正常;
  2. 结果页逻辑非常简单,并没有明显吃内存的代码。

追踪过程

  首先使用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内存分析过程的更多相关文章

  1. Android内存分析工具

    在Android系统开发过程中,经常会要去分析进程的内存的使用情况,简单介绍下Android内存分析的相关工具. 文章参考: 1.dumpsys 2.memory-analysis-command 1 ...

  2. Android 内存分析工具 MAT(Memory Analyzer Tool)

    如果使用DDMS确实发现了我们的程序中存在内存泄漏,那又如何定位到具体出现问题的代码片段,最终找到问题所在呢?如果从头到尾的分析代码逻辑,那肯定 会把人逼疯,特别是在维护别人写的代码的时候.这里介绍一 ...

  3. Android内存分析工具DDMS heap + MAT 安装和使用

    一  Java内存分析工具扫盲 如果像我一样一点都不了解,可以先进行内存分析工具扫盲   MAT介绍:     Eclipse Memory Analyzer(MAT)一个功能丰富的 JAVA 堆转储 ...

  4. Android内存分析命令(转)

    一.概述 1.1 内存指标概念 Item 全称 含义 等价 USS Unique Set Size 物理内存 进程独占的内存 PSS Proportional Set Size 物理内存 PSS= U ...

  5. android内存分析:heap Snapshot的使用

    网上有很多讲解关于android studio中memory工具的使用,接下来我来说一段在项目中发生的实例:大家可以根据我的这个方法来分析自己项目中的问题 首先我们要通过手动先触发GC操作,点击mem ...

  6. Android 内存分析工具 - LogCat GC

    一.GC_Reason 触发垃圾回收的回收的集中原因: 类型 描述 GC_CONCURRENT 内存使用将满时,并发的进行垃圾回收. GC_FOR_MALLOC 当内存已满应用尝试分配内存时会出触发垃 ...

  7. Android 内存分析

    1.使用adb命令查看app内存使用情况 adb shell dumpsys meminfo <package_name> adb shell top | grep <package ...

  8. Android内存泄漏检测利器:LeakCanary

    Android内存泄漏检测利器:LeakCanary MAR 28TH, 2016 是什么? 一言以蔽之:LeakCanary是一个傻瓜化并且可视化的内存泄露分析工具 为什么需要LeakCanary? ...

  9. android--------Android内存分析工具的使用

    内存分析(in-memory analytics)是我们编写速度快.效率高的代码必不可少的知识.如果自己编写的代码在内存的分配一无所知,我想这样的程序让你去优化,应该是无从下手的.那么内存分析是什么? ...

随机推荐

  1. 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 ...

  2. GFT_News Auto

    using AnfleCrawler.Common; using Newtonsoft.Json.Linq; using System; using System.Collections.Generi ...

  3. sqoop的命令行操作

  4. 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 ...

  5. Swift的文档注释

    官方文档地址:https://developer.apple.com/library/mac/documentation/Xcode/Reference/xcode_markup_formatting ...

  6. linux系统下php安装mbstring扩展的二种方法

    .执行 复制代码代码如下: yum install php-mbstring 2. 修改php.ini (这一步非常重要, 部分lxadmin版本无法自动修改) 复制代码代码如下: echo ‘ext ...

  7. 线程和NSThread 、 NSOperation

    1 使用NSThread实现打地鼠 1.1 问题 NSThread是ios提供的轻量级的多线程解决方案,但是需要自己管理线程的生命周期.线程同步等.本案例使用NSThread实现一个打地鼠的小游戏,在 ...

  8. C++学习笔记23:库

    静态库(Archives) 后缀一般为"*.a" 使用两个目标文件创建单一静态库的编译与链接命令:ar cr libtest.a  test1.o test2.o 链接器搜索静态库 ...

  9. 关于 Unix 用户权限及进程权限及 Saved set-user-id

    最近在看APUE,看到3.14节,fcntl的时候#include <fcntl.h>int fcntl(int fd, int cmd, .../* int arg */);出错返回-1 ...

  10. charles 结合mocky 模拟数据

    重定向(模拟造数据) 例如:E代送商户端订单列表,模拟99+订单 接口:http://api.edaisong.com/20151022/order/consigneeaddressb 打开http: ...