掌握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界面,然后就可以进行录制了。
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学习专栏

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python批量检查folder中的文件是否符合要求

目录 问题描述: 问题解决: 问题描述: 最近在手动整理一些文档,要求是每一个folder以ID命名,每一个folder中存放三个内容(如下图)。如何实现批量检查每一个folder三个内容是否存在?…

Java 数据库时间返回前端显示错误(差8个小时)

文章目录 0 可能错误截图1 在属性上加自定义Json返回注释 JsonSerialize2 新建实体类 CustomDateTimeSerializer 0 可能错误截图 1 在属性上加自定义Json返回注释 JsonSerialize TableField(value "create_time")JsonSerialize(using CustomDateTimeSerializer.cla…

Could not autowire. There is more than one bean of ‘ xxx ‘ type.

1、问题描述 有时候我们使用Autowired,注入自己写的一个bean对象时,IDEA有报错提示There is more than one bean of CustomerRentFeign type. 虽然可以忽略,但是 也可以 彻底解决。 spring容器中 本身就有一个CustomerRentFeign类型的代理对…

解决github打不开的方法

解决github打不开的方法 本文参考文章:解决可ping通但无法访问github网站的问题 一、确定域名github.com的ip地址 进入网址 IP/服务器github.com的信息 - 站长工具 (chinaz.com),查看 ip 地址。 20.205.243.166 github.com二、确定域名github.global.…

Centos虚拟机忘记密码-修改密码

1.重启系统 2.在这个选择界面,按e建 3.找到如下位置,插入init/bin/sh 4.填写完成后按Ctrlx引导启动 5.输入mount -o remount, rw / (注意空格) 6.重置密码 出现以下为重置成功 7.执行touch /.autorelabel 8.退出exec /sbin/init 9.输入你的新密…

Redis 和 Mysql 如何保证数据一致性

项目场景: 一般情况下,Redis 用来实现应用和数据库之间读操作的缓存层,主要目的是减少数据库 IO,还可以提升数据的 IO 性能。 如下图所示,这是它的整体架构。 当应用程序需要去读取某个数据的时候,首先会先…

论文笔记:SUPERVISED CONTRASTIVE REGRESSION

2022arxiv的论文,没有中,但一作是P大图班本MIT博,可信度应该还是可以的 0 摘要 深度回归模型通常以端到端的方式进行学习,不明确尝试学习具有回归意识的表示。 它们的表示往往是分散的,未能捕捉回归任务的连续性质。…

恺英网络宣布:与华为鸿蒙系统展开合作,将开发多款手游

8月5日消息,恺英网络宣布旗下子公司盛和网络参加了华为开发者大会(HDC.Together)游戏服务论坛,并在华为鸿蒙生态游戏先锋合作启动仪式上进行了亮相。恺英网络表示,将逐步在HarmonyOS上开发多款游戏,利用Har…

【Docker】Docker容器数据卷、容器卷之间的继承和DockerFIle的详细讲解

🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,目前学习C/C、算法、Python、Java等方向,一个正在慢慢前行的普通人。 🏀系列专栏:陈童学的日记 💡其他专栏:CSTL&…

k8s kubeadm命令升级集群 从1.17升级到1.18

k8s kubeadm命令升级集群 从1.17升级到1.18 大纲 注意事项master节点执行升级命令master节点和node节点执行命令 注意事项 目标当前线上k8s集群版本是k8s1.17 想把k8s升级到1.18。注意k8s不能跨版本升级例如k8s1.17不能直接升级到k8s1.19,需要先升级到1.18才后向…

企业内网终端安全无客户端准入控制技术实践

终端无代理/无客户端准入控制技术因其良好的用户体验而倍受创新企业的青睐。无代理/无客户端准入控制技术,顾名思义,是一种在网络中对终端实施访问控制的方法,无需依赖特定的客户端软件。 不同于银行、医院等传统行业的终端准入控制需求&…

【Rust】Rust学习

文档:Rust 程序设计语言 - Rust 程序设计语言 简体中文版 (bootcss.com) 墙裂推荐这个文档 第一章入门 入门指南 - Rust 程序设计语言 简体中文版 第二章猜猜看游戏 猜猜看游戏教程 - Rust 程序设计语言 简体中文版 (bootcss.com) // 导入库 use std::io; use s…