记一次 Android 高内存排查

本文未使用Android Studio内置Profile分析工具,其一是因为使用时AS明显卡顿一不小心就会无响应,其二部分应用无法连接AS 抓取日志,因此采取最原始但是最万能的方式 adb 抓取 + MAT分析

文章目录

  • [1 查看内存情况 adb shell dumpsys meminfo com.gerry.lifecycle](#1 查看内存情况 adb shell dumpsys meminfo com.gerry.lifecycle)
  • [2 dump hprof 并转成 mat格式](#2 dump hprof 并转成 mat格式)
  • [3 分析 hprof](#3 分析 hprof)

1 查看内存情况 adb shell dumpsys meminfo com.gerry.lifecycle

TOTAL PSS: App进程总内存,313146 KB = 305M

Java Heap: Java堆内存,hprof文件中的内存主要是来自这里, 250476KB = 244M

2 dump hprof 并转成 mat格式

bash 复制代码
adb shell am dumpheap com.gerry.lifecycle   /data/local/tmp/demo.hprof

adb pull /data/local/tmp/demo.hprof /Users/liangchaojie/Desktop/mem/demo.hprof

hprof-conv /Users/liangchaojie/Desktop/mem/demo.hprof /Users/liangchaojie/Desktop/mem/demo_mat.hprof

3 分析 hprof

使用之前提到的 MAT 工具打开 demo_mat.hprof MAT安装教程在这里在这里!

整个hprof文件221.9M,MainActivity这个对象所引用的对象内存总共205.4M,占比 92.56%,我们点击进入Dominator Tree来分析最大对象是什么

我们发现MainActivity及其引用的对象内存是215389872 byte = 205.4 MB,占比确实是 92.5%,重点看这个对象引用了哪些对象

右键点击

MainActivity 类内部有一个 list 集合,放了这10000000个对象,检查代码如下

至此问题就定位到了,原来是创建了很多 Person对象导致的,每个对象多大内存呢?大概16byte

相关推荐
千码君20166 小时前
kotlin:Jetpack Compose 给APP添加声音(点击音效/背景音乐)
android·开发语言·kotlin·音效·jetpack compose
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.7 小时前
MySQL半同步复制与GTID实战详解
android·mysql·adb
leonkay7 小时前
到底应不应该写注释?
性能优化·架构·个人开发·注释·代码规范·设计·规格说明书
用户41659673693558 小时前
深度解码:记一次视频时间戳(PTS)异常导致的播放故障排查
android
qq_283720058 小时前
Python GIL 底层实现与高并发突破实战
python·性能优化·高并发·全局锁
大白菜和MySQL9 小时前
linux系统环境常用命令
android·linux·adb
Ehtan_Zheng10 小时前
彻底告别 AndroidX 依赖:如何在 KMP 中构建 100% 复用的 UI 逻辑层?
android
Hello小赵10 小时前
C语言如何自定义链接库——编译与调用
android·java·c语言
IT枫斗者10 小时前
构建具有执行功能的 AI Agent:基于工作记忆的任务规划与元认知监控架构
android·前端·vue.js·spring boot·后端·架构
用户693717500138411 小时前
XChat 为什么选择 Rust 语言开发
android·前端·ios