android studio内存分析之Memory profiler的使用
目录
- Android Studio中内存分析工具Memory profiler的使用
- 1. 打开Memory Profiler
- 2. 工具使用
- 3. 内存选项说明
- 4. 内存性能分析器概览
- 5. 内存计算方式
- 6. 查看内存分配
- 7. 捕获java/kotlin方式查看内存分配
- 8. 堆转储文件导入和导出
- 内存性能分析器中的泄漏检测
Android Studio中内存分析工具Memory profiler的使用
参考文章
1. 打开Memory Profiler
有两种方式打开,第一种通过标题栏打开:

第二种通过下方菜单栏打开

2. 工具使用
打开后是这样的:

打开后,点击 + 号,选择自己包名

选择完成后,就会创建你项目的SESSIONS界面:

如果想删除这个SESSIONS,右键删除:

点击memory这一列

点击后到内存捕获类型页面
3. 内存选项说明
- 捕获堆转储(Capture heap dump):查看应用程序中在特定时间点使用内存的对象
- 记录Native分配(Record native allocations):查看每个C/C++对象在一段时间内是如何分配的
- 记录java/kotlin分配(Record java/kotlin allocations):查看在一段时间内如何分配每个java/kotlin对象

然后是这个页面


然后看到这个页面


4. 内存性能分析器概览
原文链接
内存性能分析图
当您首次打开内存性能分析器时,您将看到一条表示应用内存使用量的详细时间轴,并可使用各种工具强制执行垃圾回收、捕获堆转储以及记录内存分配

- 用于强制执行垃圾回收事件的按钮
- 用于捕获堆转储的按钮
- 用于指定性能分析器多久捕获一次内存分配的下拉菜单
- 用于缩放时间轴的按钮
- 用于跳转到实时内存数据的按钮
- 事件时间轴,显示活动状态、用户输入事件和屏幕旋转事件
- 内存使用量时间轴,它会显示以下内容
- 一个堆叠图表,显示每个内存类别当前使用多少内存,如左侧的 y 轴以及顶部的彩色键所示
- 一条虚线,表示分配的对象数,如右侧的 y 轴所示
- 每个垃圾回收事件的图标
5. 内存计算方式
内存性能分析器顶部看到的数字

内存计数中的类别如下
- Java:从 Java 或 Kotlin 代码分配的对象的内存
- Native:从 C 或 C++ 代码分配的对象的内存
- Graphics:图形缓冲区队列为向屏幕显示像素(包括 GL 表面、GL 纹理等等)所使用的内存
- Stack:您的应用中的原生堆栈和 Java 堆栈使用的内存。这通常与您的应用运行多少线程有关
- Code:您的应用用于处理代码和资源(如 dex 字节码、经过优化或编译的 dex 代码、.so 库和字体)的内存
- Others:您的应用使用的系统不确定如何分类的内存
- Allocated:您的应用分配的 Java/Kotlin 对象数。此数字没有计入 C 或 C++ 中分配的对象
6. 查看内存分配
选择Capture heap dump,并点击Record按钮,开始捕获,捕获完成后,点击Stop,进行分析

查看捕获结果


检查分配记录步骤:
- 点击 Class Name 列标题以按字母顺序排序。然后,点击一个类名称。此时下侧将出现
- Instance View 窗格,显示该类的每个实例
- 在 Instance View 窗格中,点击一个实例。此时下方将出现 References 标签页,显示该实例被4. 分配到何处以及在哪个线程中。
- 在 References 标签页中,右键点击任意行并选择 Jump to Source,以在编辑器中打开该代码
菜单查看说明

菜单-检查的堆:
- default heap:当系统未指定堆时
- image heap:系统启动映像,包含启动期间预加载的类。此处的分配确保绝不会移动或消失
- zygote heap:写时复制堆,其中的应用进程是从 Android 系统中派生的
- app heap:您的应用在其中分配内存的主堆
- JNI heap:显示 Java 原生接口 (JNI) 引用被分配和释放到什么位置的堆
菜单-分配:
-
Arrange by class:根据类名称对所有分配进行分组。这是默认值
-
Arrange by package:根据软件包名称对所有分配进行分组
-
Arrange by callstack:将所有分配分组到其对应的调用堆栈
-
捕获Native方式查看内存分配
捕获Native

native结果数据

结果信息说明: -
Allocations:在选定时间段内通过 malloc() 或 new 运算符分配的对象数
-
Deallocations:在选定时间段内通过 free() 或 delete 运算符解除分配的对象数
-
Allocations Size:在选定时间段内所有分配的总大小(以字节为单位)
-
Deallocations Size:在选定时间段内所有已释放内存的总大小(以字节为单位)
-
Total Count:Allocations 列中的值减去 Deallocations 列中的值所得的结果
-
Remaining Size:Allocations Size 列中的值减去 Deallocations Size 列中的值所得的结果
7. 捕获java/kotlin方式查看内存分配

Allocation Tracking下拉菜单说明
- Full:捕获内存中的所有对象分配。这是 Android Studio 3.2 及更低版本中的默认行为
- Sampled:定期对内存中的对象分配情况进行采样。
- Off:停止跟踪应用的内存分配
8. 堆转储文件导入和导出
- 堆转储文件导出
在Sessions列表中,点击会话条目右侧的 Export method trace 或 Export system trace 按钮

- 堆转储文件导入
Sessions 窗格中点击 Start new profiler session 图标"+",然后选择 Load from file

内存性能分析器中的泄漏检测
-
检查内存泄漏
捕获堆转储(Capture heap dump)检测期间操作设备,完成后点击Stop按钮,检测结束后,显示有内存泄漏及内存泄漏的数目

-
如何查看内存泄漏的位置
双击内存泄漏的位置,显示内存泄漏的列表

-
点击列表中其中一个,显示实例对象

-
点击实例对象,显示详细信息

-
切换到References选项卡,并点击show nearest GC root only

-
右键选择jump to source

-
跳转到源码,可以看到是thread引起的内存泄漏

相关文章:
android studio内存分析之Memory profiler的使用
目录 Android Studio中内存分析工具Memory profiler的使用1. 打开Memory Profiler2. 工具使用3. 内存选项说明4. 内存性能分析器概览5. 内存计算方式6. 查看内存分配7. 捕获java/kotlin方式查看内存分配8. 堆转储文件导入和导出 内存性能分析器中的泄漏检测 Android Studio中内…...
Qt下载慢/无法下载解决方式
文章目录 一. Qt在线安装下载二. 安装方式 一. Qt在线安装下载 官网下载:https://www.qt.io/download清华源下载:https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/online_installers/ 二. 安装方式 进入下载好的目录 在目录栏输入CMD&…...
【UE4 RTS】04-Camera Pan
前言 本篇实现了CameraPawn的旋转功能。 效果 步骤 1. 打开项目设置,添加两个操作映射 2. 打开玩家控制器“RTS_PlayerController_BP”,新建一个浮点型变量,命名为“PanSpeed” 在事件图表中添加如下节点 此时运行游戏可以发现当鼠标移动…...
出现raise NotImplementedError报错
在学习《动手学深度学习》时,实现下面代码时,报出raise NotImplementedError错误。 import collections import torch from d2l import torch as d2l import math from torch import nnclass Seq2SeqEncoder(d2l.Encoder):def __init__(self,vocab_size,…...
第一百二十二天学习记录:C++提高:STL-vector容器(上)(黑马教学视频)
vector基本概念 功能: vector数据结构和数组非常相似,也称为单端数组 vector与普通数组区别: 不同之处在于数组是静态空间,而vector可以动态扩展 动态扩展: 并不是在原空间之后续接新的空间,而是找更大的内…...
《Linux从练气到飞升》No.11 初识操作系统
🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…...
什么是 XSS 攻击?
概念 XSS 攻击指的是跨站脚本攻击,是一种代码注入攻击。攻击者通过在网站注入恶意脚本,使之在用户的浏览器上运行,从而盗取用户的信息如 cookie 等。 XSS 的本质是因为网站没有对恶意代码进行过滤,与正常的代码混合在一起了&…...
基于Spring Boot的招聘网站的设计与实现(Java+spring boot+MySQL)
获取源码或者论文请私信博主 演示视频: 基于Spring Boot的招聘网站的设计与实现(Javaspring bootMySQL) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 微信小程序 后端:Java springboot框…...
中级课程——CSRF
文章目录 案例原理挖掘 案例 原理 挖掘 挖掘详情 首先就是对目标敏感部位进行抓包分析,比如修改信息、转账、添加信息等等。通常一个数据包HTTP请求头里边都会有一个Referer,这个需要特别去验证。比如放到Burpsuit Repeater里边去测试:去掉…...
面试热题(岛屿数量)
给你一个由 1(陆地)和 0(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均…...
【WebRTC---源码篇】(二十四)GCC获取码率后的分配
RtpTransportControllerSend::PostUpdates 配置码率 GoogCcNetworkController::GetPacingRates pacing_factor_默认2.5。也就是说pacer发送报文的码率是探测码率的2.5倍。 PacerConfig GoogCcNetworkController::GetPacingRates(Timestamp at_time) const {// Pacing rate …...
数据可视化工具LightningChart .NET正式发布v10.5.1——拥有全新的3D新功能
LightningChart.NET完全由GPU加速,并且性能经过优化,可用于实时显示海量数据-超过10亿个数据点。 LightningChart包括广泛的2D,高级3D,Polar,Smith,3D饼/甜甜圈,地理地图和GIS图表以及适用于科学…...
AWS认证SAA-C03每日一题
本题库由云计算狂魔微信公众号分享。 【SAA-C03助理级解决方案架构师认证】A company has a multi-tier application that runs six front-end web servers in an Amazon EC2 Auto Scaling group in a single Availability Zone behind an Application Load Balancer(ALB).A …...
ASP.NET Core MVC -- 将视图添加到 ASP.NET Core MVC 应用
Index页 右键单击“视图”文件夹,然后单击“添加”>>“新文件夹”,并将文件夹命名为“HelloWorld”。 右键单击“Views/HelloWorld”文件夹,然后单击“添加”>“新项”。 在“添加新项 - MvcMovie”对话框中: 在右上…...
基于R做宏基因组结果的PCoA分析
写在前面 因为公司给的PCA结果效果不佳,决定从中重新挑选部分样本进行再分析 步骤 表格结果预处理 在属水平genus参考原本结果已有的PCA图,尽可能挑选距离较远且聚团的样本 选取不同样本属水平的丰度数据,整理成逗号分隔的csv文件 代码…...
8.10 算法刷题【1道题】
8.10 算法刷题 22. 链表中环的入口结点(快慢指针) 22. 链表中环的入口结点(快慢指针) 原题链接 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x…...
Apache Maven:从构建到部署,一站式解决方案
目录 一、Maven介绍 1. Maven是什么? 2.Maven的作用? 二、Maven仓库介绍 2.1 库的分类 三、Maven安装与配置 3.1 Maven安装 3.2 Maven环境配置 3.3 仓库配置 四、Eclipse与Maven配置 五、Maven项目测试 5.1 新建Maven项目步骤及注意事项 5.…...
文章四:版本控制策略 - 穿越时光机:Git版本控制进阶技巧
开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun 概述 版本控制是Git的核心功能,它使得开发者可以记录代码的历史变更,并能够在不同版本…...
爬虫如何应对网站的反爬机制?如何查找user-agent对应的值
import requestsurl https://movie.douban.com/top250 response requests.get(url) # 查看结果 print(response)在requests使用一文中我们有讲到,当状态码不是200时表示爬虫不可用,也就是说我们获取不到网页源代码。但是我们还是可以挣扎一下ÿ…...
一个概率论例题引发的思考
浙江大学版《概率论与梳理统计》一书中的,第13章第1节例2如下: 这个解释和模型比较简单易懂。接下来,第2节的例2是一个关于此模型的题目: 在我自己的理解中,此题的解法跟上一个题目一样,第二级传输后&…...
SDD基于规范编程-OpenSpec及SuperPowers沙
智能体时代的代码范式转移与 C# 的战略转型 传统的 C# 开发模式,即所谓的“工程导向型”开发,要求开发者创建一个复杂的项目结构,包括项目文件(.csproj)、解决方案文件(.sln)、属性设置以及依赖…...
喔去,litellm 竟然被投毒了,赶紧检查你的机器中招了没有敝
一、什么是setuptools? setuptools 是一个用于创建、分发和安装 Python 包的核心库。 它可以帮助你: 定义 Python 包的元数据(如名称、版本、作者等)。 声明包的依赖项,确保你的包能够正确运行。 构建源代码分发包&…...
VMD 1.9.4实战:如何高效查看蛋白质-配体分子动力学模拟轨迹(附帧数优化技巧)
VMD 1.9.4实战:如何高效查看蛋白质-配体分子动力学模拟轨迹(附帧数优化技巧) 分子动力学模拟已成为研究蛋白质-配体相互作用的重要工具,而可视化分析则是理解模拟结果的关键环节。Visual Molecular Dynamics(VMD&#…...
为什么92%的Python工程师还没掌握无锁并发?——CPython 3.13 subinterpreter实战避坑清单(含内存泄漏检测脚本)
第一章:无锁并发的底层逻辑与CPython 3.13 subinterpreter革命性意义无锁并发(Lock-Free Concurrency)并非简单地“不用锁”,而是通过原子操作(如 compare-and-swap、load-acquire/store-release)构建线程安…...
终极启动盘制作工具:Deepin Boot Maker 完整使用指南
终极启动盘制作工具:Deepin Boot Maker 完整使用指南 【免费下载链接】deepin-boot-maker 项目地址: https://gitcode.com/gh_mirrors/de/deepin-boot-maker Deepin Boot Maker 是一款免费开源、简单快速的启动盘制作工具,专为新手和普通用户设计…...
Type-C接口选6Pin、16Pin还是24Pin?一张图看懂你的电路板该怎么选(附立创EDA元件库)
Type-C接口选型指南:6Pin、16Pin还是24Pin?硬件设计实战解析 Type-C接口的普及让硬件设计变得更加灵活,但面对6Pin、16Pin和24Pin三种常见规格,工程师们常常陷入选择困难。本文将深入剖析这三种接口的核心差异,从功能特…...
loadtest WebSocket测试全攻略:实时应用的性能验证方法
loadtest WebSocket测试全攻略:实时应用的性能验证方法 【免费下载链接】loadtest Runs a load test on the selected URL. Fast and easy to use. Can be integrated in your own workflow using the API. 项目地址: https://gitcode.com/gh_mirrors/lo/loadtest…...
Python数据库编程全面指南:从SQL到NoSQL
Python数据库编程全面指南:从SQL到NoSQL 1. 背景介绍 数据库是现代应用程序的核心组件之一,用于存储和管理数据。Python作为一种广泛使用的编程语言,提供了丰富的库和工具来与各种数据库进行交互。本文将全面介绍Python数据库编程,…...
leetcode 1636. 按照频率将数组升序排序-耗时100-Sort Array by Increasing Frequency
Problem: 1636. 按照频率将数组升序排序- Sort Array by Increasing Frequency 耗时100%,哈希表统计频次,然后频次和数字放入数组,按照题意的规则排序,最后得到最终的数组 Code class Solution { public:int ump[201];vector<…...
自动化测试面试中常见的问题
一、测试用例再执行点击元素时失败,导致整个测试用例失败。如何提高点击元素的成功率?解决办法:selenium是在点击元素时是通过元素定位的方式找到元素的,要提高点击的成功率,必须保证找到元素的定位方式准确。但是在自动化工程的…...
