掌握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.hprof

hprof-conv是 android sdk 工具,目录\Sdk\platform-tools

官网说明文档

三、如何使用

如下图所示,依次点击profile - memory ,然后会跳转到 memory界面,然后就可以进行录制了。
1

如果找不到依次点击 菜单栏的 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学习专栏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/61207.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 热题 100 JavaScript--102. 二叉树的层序遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] 示例 2: 输入:root [1…

il汇编整数相加

在这里尝试了IL汇编字符串连接; IL汇编字符串连接_bcbobo21cn的博客-CSDN博客 下面来看一下IL汇编整数相加; 大概的看一下一些资料,下面语句, ldc.i4 20 ldc.i4 30 add 看上去像是,装载整数20到一个类似于…

【C++学习手札】一文带你初识构造函数和拷贝构造函数、析构函数

食用指南:本文在有C基础的情况下食用更佳 🍀本文前置知识: C类 ♈️今日夜电波: アイネクライネ —米津玄師 1:11 ━━━━━━️💟──────── 4:50 …

vue el-input 使用 回车键会刷新页面的问题

场景: vue项目中 在输入框输入字符并按下回车键搜索时,不会进行搜索, 而是会刷新页面 原因: 当form表单中只有一个input时,按下回车建会自动触发页面的提交功能, 产生刷新页面的行为 解决: 在…

《Java-SE-第二十九章》之Synchronized原理与JUC常用类

前言 在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!” 博客主页:KC老衲爱尼姑的博客主页 博主的github,平常所写代码皆在于此 共勉:talk is cheap, show me the code 作者是爪哇岛的新手,水平很有限&…

【ChatGPT 指令大全】怎么利用ChatGPT写报告

目录 选定切入角度 报告开头 大纲生成 草稿撰写 研究报告 提出反对观点 报告总结 研究来源 总结 随着人工智能技术的快速发展,自然语言处理技术在各个领域的应用越来越广泛。其中,ChatGPT作为目前最先进的自然语言处理模型之一,其强…

助力618-Y的混沌实践之路 | 京东云技术团队

一、写在前面 1、混沌是什么? 混沌工程(Chaos Engineering)的概念由 Netflix 在 2010 年提出,通过主动向系统中引入异常状态,并根据系统在各种压力下的行为表现确定优化策略,是保障系统稳定性的新型手段。…

Go语言time库,时间和日期相关的操作方法

time库 用于处理时间、日期和时区的核心库。在实际开发中,常常需要与时间打交道,例如记录日志、处理时间差、计算时间间隔等等。因此,掌握time库的使用方法对于Go开发者来说非常重要。 在Go语言中,时间表示为time.Time类型&…

基于 yolov8 的人体姿态评估

写在前面 工作中遇到,简单整理博文内容为使用预训练模型的一个预测 Demo测试图片来源与网络,如有侵权请告知理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停…

嵌入式开发学习(STC51-15-红外遥控)

内容 使用外部中断功能,使按下红外遥控器,将对应键值编码数据解码后通过数码管显示 红外遥控介绍 红外线简介 人的眼睛能看到的可见光按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫; 其中红光的波长范围为 0.62&…

Flink Windows(窗口)详解

Windows(窗口) Windows是流计算的核心。Windows将流分成有限大小的“buckets”,我们可以在其上应用聚合计算(ProcessWindowFunction,ReduceFunction,AggregateFunction或FoldFunction)等。在Fl…

一、ADAS技术概述

根据《国家车联网产业标准体系建设指南》对智能网联汽车定义:智能网联汽车是指搭载先进的车载传感器、控制器、执行器等装置,并融合现代通信与网络技术,实现车与X(人、车、路、云端等)智能信息交换、共享,具…

阶段总结(linux基础)

目录 一、初始linux系统 二、基本操作命令 三、目录结构 四、文件及目录管理命令 查看文件内容 创建文件 五、用户与组管理 六、文件权限与压缩管理 七、磁盘管理 八、系统程序与进程管理 管理机制 文件系统损坏 grub引导故障 磁盘资源耗尽 程序与进程的区别 查…

【云原生】Serverless 技术架构分析

一、什么是Serverless? 1、Serverless技术简介 ​ Serverless(无服务器架构)指的是由开发者实现的服务端逻辑运行在无状态的计算容器中,它由事件触发, 完全被第三方管理,其业务层面的状态则被开发者使用的数据库和存…

交换机Vlan实验

介绍 Vlan表示虚拟局域网。 常见的网络安全技术 VlanACL Vlan的作用 Vlan隔离了广播域,增加了网络的安全性。 知识点 默认vlan vlan1 是默认vlan,主要机器开机了,默认所有的接口都属于Vlan1 交换机的接口模式 Access : 这个模式用来…

【设计模式】-建造者模式

Java建造者模式:创建复杂对象的灵活构建者 在软件开发中,我们经常遇到需要创建一个复杂对象的情况。如果使用传统的构造函数进行对象创建,可能会导致构造函数参数过多,难以管理和维护。建造者模式(Builder Pattern&am…

MongoDB 使用总结

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

无人驾驶实战-第五课(动态环境感知与3D检测算法)

激光雷达的分类: 机械式Lidar:TOF、N个独立激光单元、旋转产生360度视场 MEMS式Lidar:不旋转 激光雷达的输出是点云,点云数据特点: 简单:x y z i (i为信号强度) 稀疏:7%&…

【肺炎分类数据集】数据量非常充足的新冠肺炎分类数据共享

一、肺炎数据集介绍🍉: 1.1 格式🎈 按照标准的格式分为了①训练集train(134138575198张),②验证集val(8816张),③测试集test(234390624张)&#…

Windows server上用nginx部署vue3项目

Windows server上用nginx部署vue3项目 一、Node中node_modules文件夹及package.json文件的作用说明二、VUE3项目打包三、Windows Server上的Nginx部署 一、Node中node_modules文件夹及package.json文件的作用说明 node_modules是安装node后用来存放用包管理工具下载安装的包的…