掌握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.…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
