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是一个关于此模型的题目: 在我自己的理解中,此题的解法跟上一个题目一样,第二级传输后&…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...