记一次 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

相关推荐
恋猫de小郭30 分钟前
Flutter 大小核优化又被回滚,然后又开新提案?
android·前端·flutter
Kapaseker33 分钟前
领导问我 Kotlin 的 Nothing 是什么?
android·kotlin
韩曙亮1 小时前
【错误记录】安卓 adb 调试 5037 端口占用排查 ( adb 的三层结构 | 找出本机占用 5037 的进程 )
android·数据库·adb·安卓·错误记录
三少爷的鞋2 小时前
不改变异步本质,只改变代码组织:Telegram 项目的 Kotlin 协程实践
android
好的佩奇11 小时前
蓝牙之广播与扫描
android·flutter·蓝牙
传奇开心果编程13 小时前
【Jetpack Compose娓娓道来】第36课:焦点管理与键盘输入——让遥控器、键盘和输入法都“找得到北”
android·kotlin·移动开发·交互·android jetpack·ui框架·声明式ui
hai_android14 小时前
AudioTrack 深度解析:从原理到实战
android·java·kotlin
红尘伴蝶舞14 小时前
从秒开优化到连环崩溃:深入剖析 ViewPager2 在常驻 DialogFragment 中的复用陷阱与自愈方案
android·kotlin
数据库小学妹17 小时前
MySQL大字段治理:行溢出机制、覆盖索引与拆表
数据库·mysql·性能优化
贾伟康18 小时前
【共创稿事节】HarmonyOS 7.0 Progress进度体系:从接入到生产验证
性能优化·实战·harmonyos·arkts·arkui