掌握Memory Profiler技巧:识别内存问题
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。
专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。
目录
- 一、导读
- 二、概览
- 三、如何使用
- 四、页面说明
- 4.1 Java 和 Kotlin 分配情况分析
- 4.1.1 时间轴及对应的内存
- 4.1.2 tab & visualization
- 4.1.3
- 4.1.4
- 4.1.5
- 4.1.6 class name
- 4.1.7 instance
- 4.2 堆转储文件分析
- 4.2.1 过滤器
- 4.2.2 统计信息
- 4.2.3 class name
- 4.2.4 instance
- 五、 推荐阅读
一、导读
我们继续总结学习Android 基础知识,温故知新。
二、概览
Memory Profiler 是 Android Profiler 中的一个组件,可帮助您识别可能会导致应用卡顿、冻结甚至崩溃的内存泄露和内存抖动。
它显示一个应用内存使用量的实时图表,让您可以捕获堆转储、强制执行垃圾回收以及跟踪内存分配。
Memory Profiler我们主要用于识别内存泄漏、抖动 ,提供捕获堆转储、强制GC、跟踪内存分配
通过Memory Profiler 保存的堆转储文件,需要进行一次转换才能在MAT中打开。
hprof-conv heap-original.hprof heap-converted.hprofhprof-conv是 android sdk 工具,目录\Sdk\platform-tools
官网说明文档
三、如何使用
如下图所示,依次点击profile - memory ,然后会跳转到 memory界面,然后就可以进行录制了。
如果找不到依次点击 菜单栏的 View > Tool Windows > Profiler
四、页面说明
在memory页面,有两个内存录制选项,下面分别来说明
4.1 Java 和 Kotlin 分配情况分析
当完成录制后,其界面如下图所示,我们来分别说明一下:
我们大致分成七个部分
4.1.1 时间轴及对应的内存
可以随时在时间轴上拖动以选择要查看哪个区域的分配,最上面是页面及用户操作记录
4.1.2 tab & visualization
4.1.3
过滤器
您可以使用已分配对象列表上方的两个菜单选择需检查的堆以及如何组织数据,如下图所示:
-
View image heap:系统启动映像,包含启动期间预加载的类。此处的分配保证绝不会移动或消失。
-
View zygote heap:写时复制堆,其中的应用进程是从 Android 系统中派生的。
-
View app heap:选择的应用在其中分配内存的主堆。如果我们只关心我们App的话,选这项即可。
-
View JNI heap: 显示 Java 原生接口 (JNI) 引用被分配和释放到什么位置的堆。
4.1.4
过滤器
-
Arrange by class:根据类名称对所有分配进行分组。这是默认选项。
-
Arrange by package:根据软件包名称对所有分配进行分组。
-
Arrange by callstack:将所有分配分组到其对应的调用堆栈。
一般采用采用Arrang by class过滤占用内存占比比较高的类进行分析,Arrang by package根据包名定位自己代码、三方代码的内存问题
4.1.5
输入过滤:在输入框中可以输入类名/包名来快速定位到具体类/包名下类的内存分配情况
4.1.6 class name
创建的对象数其分配内存情况
这部分会列举过滤之后的所有类名、分配的对象数及内存使用情况,包括
- Class Name: 类名
- Allocations: 此类创建的实例对象数量
- Dellocations:对象堆中释放数(低于8.0手机无此项)
- Total count:对象在堆中未被回收的数量
- Shallow Size: 此类使用的java内存总量(单位字节)
- Native Size: 此类总共使用的原生内存总量(只有android7.0+设备才能看到)(单位字节)
- Retained Size: 此类实例对象仍存活而保留的内存总大小(单位字节)
4.1.7 instance
类实例对象列表及其实例对象的详细信息
在6中点击某一个类,会在下半部分显示此类的所有实例对象的信息,如图
最右边的 Call Stack 标签页,显示该实例被分配到何处以及在哪个线程中。
4.2 堆转储文件分析
当完成录制后,其界面如下图所示,我们来分别说明一下:
我们大致分成4个部分
4.2.1 过滤器
-
View image heap:系统启动映像,包含启动期间预加载的类。此处的分配保证绝不会移动或消失。
-
View zygote heap:写时复制堆,其中的应用进程是从 Android 系统中派生的。
-
View app heap:选择的应用在其中分配内存的主堆。如果我们只关心我们App的话,选这项即可。
-
View all heaps: 检查分配内存的所有堆。
-
Arrange by class:根据类名称对所有分配进行分组。这是默认选项。
-
Arrange by package:根据软件包名称对所有分配进行分组。
-
Arrange by callstack:将所有分配分组到其对应的调用堆栈。
-
Show all class: 默认,显示所有的类
-
Show activity/fragment Leak: 显示发生内存泄漏的activity/fragment
-
Show project class: 进显示项目相关的类
一般采用采用Arrang by class过滤占用内存占比比较高的类进行分析,Arrang by package根据包名定位自己代码、三方代码的内存问题
输入过滤:在输入框中可以输入类名/包名来快速定位到具体类/包名下类的内存分配情况
4.2.2 统计信息
classes: 类类型总数,不是实例对象哦
Leaks:发生内存泄漏的数量
count: 总关创建的使用的实例对象数
Native Size: 原生c/c++使用的内存总量
Shallow Size: java使用的内存总量
Retained Size: 还在使用保留的内存总量
4.2.3 class name
创建的对象数其分配内存情况
这部分会列举过滤之后的所有类名、分配的对象数及内存使用情况,包括
- Class Name: 类名
- Allocations: 此类创建的实例对象数量
- Native Size: 此类总共使用的原生内存总量(只有android7.0+设备才能看到)(单位字节)
- Shallow Size: 此类使用的java内存总量(单位字节)
- Retained Size: 此类实例对象仍存活而保留的内存总大小(单位字节)
4.2.4 instance
类实例对象列表及其实例对象的详细信息
点击某个实例会在右侧显示此实例内存分配的详细信息,包括:Fields、References:
-
Fields
实例对象每个字段信息,包括如下信息: -
Instance 此字段的名称及其类型,如果是基本数据类型和String会同时显示此字段的当前值
-
Depth: 此字段可达的最短跳数,表示的是任意一个GC Root到此字段的最短链路边数
-
Native Size: 原生内存中此字段的内存大小(只有Android7.0+上的设备才会看到此列)
-
Shallow Size: Java 内存中此字段的内存大小
-
Retained Size: 此字段目前还保留的内存大小
-
References:
实例对象的引用链信息,References中包括如下信息: -
Reference: 实例对象的引用链,可以依次点击展开显示此实例被哪些实例对象所引用,通过引用链可以最终追踪到GC Root
-
Depth: 此实例对象可达的最短跳数,表示的是任意一个GC Root到此实例对象的最短链路边数
-
Native Size: 原生内存中此实例对象的内存大小(只有Android7.0+上的设备才会看到此列)
-
Shallow Size: Java 内存中此实例对象的内存大小
-
Retained Size: 此实例对象目前还保留的内存大小
我们可以在Fields和References中分析,
可以右键选择Go to Instance显示其实例内存数据;
或者选择Jump to source进入此实例对象所在的源码。
五、 推荐阅读
Java 专栏
SQL 专栏
数据结构与算法
Android学习专栏
相关文章:

掌握Memory Profiler技巧:识别内存问题
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、如何使用四、页面说明4.1 Java 和 Kotlin 分配…...

Linux学习之正则表达式元字符和grep命令
cat /etc/redhat-release看到操作系统的版本是CentOS Linux release 7.6.1810 (Core),uname -r可以看到内核版本是3.10.0-957.21.3.el7.x86_64。 正则表达式是一种搜索字符串的模式,通俗点理解,也就是普通字符和元字符共同组成的字符集合匹…...

熟练掌握ChatGPT解决复杂问题——学会提问
目录 引言 一、5W1H分析法 1. 简单的问题(what、where、when、who) 2.复杂的问题(why、how) 2.1 为什么(Why)——原因 2.2 方式 (How)——如何 二、如何提问得到更高质量的答案…...

JVM之类加载与字节码
1.类文件结构 一个简单的HelloWorld.Java package cn.itcast.jvm.t5; // HelloWorld 示例 public class HelloWorld { public static void main(String[] args) { System.out.println("hello world"); } }编译为 HelloWorld.class 后的样子如下所示: […...
【博客688】如何实现keepalived vip监控与告警
如何实现keepalived vip监控与告警 1、使用的exporter https://github.com/mehdy/keepalived-exporter2、metrics里的状态的具体含义 注意:存状态的字符串的每个状态的值其实是跟状态在数组中的索引相对应的 具体参考这里: https://github.com/mehdy…...
[QT编程系列-39]:用户界面UI - 样式表QSS与样式文件快速入门
目录 1. 概述 2. CSS 3. QSS示例 4. QT样式表文件使用方法与步骤 5. QT内置样式 6. QT常见基本样式 1. 概述 Qt提供了一种称为Qt样式表(Qt Style Sheets)的机制,可以用于自定义和美化Qt应用程序的用户界面(UI)。…...

机器学习和深度学习简述
一、人工智能、机器学习、深度学习的关系 近些年人工智能、机器学习和深度学习的概念十分火热,但很多从业者却很难说清它们之间的关系,外行人更是雾里看花。概括来说,人工智能、机器学习和深度学习覆盖的技术范畴是逐层递减的,三…...

diffusion model2 扩散模型的文本信息融合、交叉注意力机制、lora
前言 在上一篇文章中,我们剖析了diffusion model的原理,而在这一篇文章中,我们探讨与扩散模型有关的其他话题,包括扩散模型的unet是如何在推理噪声的过程中,融入文本信息的考量?其原理为交叉注意力机制&am…...

数据结构——二叉树
本章代码仓库:堆、二叉树链式结构 文章目录 🍭1. 树🧁1.1 树的概念🧁1.2 树的结构 🍬2. 二叉树🍫2.1 二叉树的概念🍫2.2 特殊的二叉树🍫2.3 二叉树的性质🍫2.4 二叉树的存…...

架构训练营学习笔记:5-3接口高可用
序 架构决定系统质量上限,代码决定系统质量下限,本节课串一下常见应对措施的框架,细节不太多,侧重对于技术本质有深入了解。 接口高可用整体框架 雪崩效应:请求量超过系统处理能力后导致系统性能螺旋快速下降 链式…...

【笔记】湖仓一体架构演进与发展
https://www.bilibili.com/video/BV1oF411F7rQ/?spm_id_from333.788.recommend_more_video.0&vd_sourcefa36a95b3c3fa4f32dd400f8cabddeaf...

政务云建设与应用解决方案[42页PPT]
导读:原文《政务云建设与应用解决方案[42页PPT]》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 完整版领取方式 完整版领取方式: 如需获取完…...

20天突破英语四级高频词汇——第①天
20天突破英语四级高频词汇~第一天加油(ง •_•)ง💪 🐳博主:命运之光 🌈专栏:英语四级高频词汇速记 🌌博主的其他文章:点击进入博主的主页 目录 20天突破英语四级…...

【网络基础实战之路】基于MGRE多点协议的实战详解
系列文章传送门: 【网络基础实战之路】设计网络划分的实战详解 【网络基础实战之路】一文弄懂TCP的三次握手与四次断开 【网络基础实战之路】基于MGRE多点协议的实战详解 【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解 PS:本要求基于…...

K8s实战入门(三)
文章目录 3. 实战入门3.1 Namespace3.1.1 测试两个不同的名称空间之间的 Pod 是否连通性 3.2 Pod3.3 Label3.4 Deployment3.5 Service 3. 实战入门 本章节将介绍如何在kubernetes集群中部署一个nginx服务,并且能够对其进行访问。 3.1 Namespace Namespace是kuber…...

Linux-centos花生壳实现内网穿透
Linux-centos花生壳实现内网穿透 官网教程 1.安装花生壳 下载网址 点击复制就可以复制下载命令了 wget "https://dl.oray.com/hsk/linux/phddns_5.2.0_amd64.rpm" -O phddns_5.2.0_amd64.rpm# 下载完成之后会多一个rpm文件 [rootlocalhost HuaSheng]# ls phddns_…...
Jackson类层次结构中的一些应用(Inheritance with Jackson)
Have a look at working with class hierarchies in Jackson. 如何在Jackson中使用类层次结构。 Inclusion of Subtype Information There are two ways to add type information when serializing and deserializing data objects, namely global default typing and per-cl…...

Python求均值、方差、标准偏差SD、相对标准偏差RSD
均值 均值是统计学中最常用的统计量,用来表明资料中各观测值相对集中较多的中心位置。用于反映现象总体的一般水平,或分布的集中趋势。 import numpy as npa [2, 4, 6, 8]print(np.mean(a)) # 均值 print(np.average(a, weights[1, 2, 1, 1])) # 带…...

SQL ASNI where from group order 顺序
SQL语句执行顺序: from–>where–>group by -->having — >select --> order 第一步:from语句,选择要操作的表。 第二步:where语句,在from后的表中设置筛选条件,筛选出符合条件的记录。 …...
springboot(39) : RestTemplate完全体
HTTP请求调用集成,支持GET,POST,JSON,Header调用,日志打印,请求耗时计算,设置中文编码 1.使用(注入RestTemplateService) Autowiredprivate RestTemplateService restTemplateService; 2.RestTemplate配置类 import org.springframework.context.annotation.Bean; import org.…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...