Android Profiler 内存分析

embedded/2024/11/14 1:48:29/

        Android studio(下面简称AS)为App提供的性能分析工具,在AS3.0+替换掉旧的分析工具,对于其使用方法,官方也有对应的介绍:Android Profiler
对于使用方法,我只用到比较简单的功能,高级的还没用到,使用案例进行简答的使用,在此之前,你可能需要到官方文档中了解Profiler中一些字段的基本意思

内存性能分析器是 Android Profiler 中的一个组件,可帮助您识别可能会导致应用卡顿、冻结甚至崩溃的内存泄漏和内存抖动。它显示一个应用内存使用量的实时图表,让您可以捕获堆转储、强制执行垃圾回收以及跟踪内存分配。

如需打开内存分析器,请按以下步骤操作:

依次点击 View > Tool Windows > Profiler(您也可以点击工具栏中的 Profile 图)。
    从 Android Profiler 工具栏中选择要分析的设备和应用进程。如果您已通过 USB 连接设备但系统未列出该设备,请确保您已启用 USB 调试。
    点击 MEMORY 时间轴上的任意位置以打开内存分析器。或者,您可以从命令行使用 dumpsys 检查您的应用内存,还可以在 logcat 中查看 GC 事件。

Memory Profiler

许多开发者使用 Memory Profiler,是希望发现和定位内存泄漏问题。在介绍 Memory Profile 如何解决这一问题之前,我想先明确 "内存泄漏" 这一概念。无论您当前是否了解内存泄漏,都将帮助我更好地解释 Memory Profile 的工作原理。

内存泄漏

什么是内存泄漏?

通常我们认为,在运行的程序中,如果一个对象无法访问却仍然占用着内存空间,即该对象造成了内存泄漏。如果您使用过 C 语言或 C++ 的指针,您会很熟悉这个概念。

但是在 Kotlin 和 Java 的世界中,事情有些许不同。因为这两种语言是运行在 Java 虚拟机 (JVM) 中的。在 JVM 中,有个重要的概念,就是垃圾回收 (GC)。当垃圾回收运行时,虚拟机会首先识别 GC Root。GC Root 是一个可以从堆外部访问的对象,它可以是本地变量或运行中的线程等。虚拟机会识别所有可以从 GC Root 访问的对象,它们将会被保留。而其他无法从 GC root 访问的对象,则会被认为是垃圾并回收掉。

内存计算方式

您在内存分析器顶部看到的数字(图 2)基于您的应用提交的所有专用内存页面(此数据由 Android 系统根据其记录提供)。此计数不包含与系统或其他应用共享的页面。

图 2. 内存分析器顶部的内存计数图例

内存计数中的类别如下:

    Java:从 Java 或 Kotlin 代码分配的对象的内存。

    Native:从 C 或 C++ 代码分配的对象的内存。

    即使您的应用中不使用 C++,您也可能会看到此处使用了一些原生内存,因为即使您编写的代码采用 Java 或 Kotlin 语言,Android 框架仍使用原生内存代表您处理各种任务,如处理图像资源和其他图形。

    Graphics:图形缓冲区队列为向屏幕显示像素(包括 GL 表面、GL 纹理等等)所使用的内存。(请注意,这是与 CPU 共享的内存,不是 GPU 专用内存。)

    Stack:您的应用中的原生堆栈和 Java 堆栈使用的内存。这通常与您的应用运行多少线程有关。

    Code:您的应用用于处理代码和资源(如 dex 字节码、经过优化或编译的 dex 代码、.so 库和字体)的内存。

    Others:您的应用使用的系统不确定如何分类的内存。

    Allocated:您的应用分配的 Java/Kotlin 对象数。此数字没有计入 C 或 C++ 中分配的对象。

    如果连接到搭载 Android 7.1 及更低版本的设备,只有在内存分析器连接到您运行的应用时,才开始此分配计数。因此,您开始分析之前分配的任何对象都不会被计入。但是,Android 8.0 及更高版本附带一个设备内置性能剖析工具,该工具可跟踪所有分配,因此,在 Android 8.0 及更高版本上,此数字始终表示您的应用中待处理的 Java 对象总数。

与以前的 Android Monitor 工具中的内存计数相比,新的内存分析器以不同的方式记录您的内存,因此,您的内存使用量现在看上去可能会更高些。内存分析器会监控一些额外的类别,这就增加了总的内存使用量,但如果您仅关心 Java 堆内存,“Java”项的数字应与以前工具中的数值相似。 然而,Java 数字可能与您在 Android Monitor 中看到的数字并非完全相同,这是因为新数字计入了自应用的 Java 堆从 Zygote 派生以来为其分配的所有物理内存页面。因此,它可以准确反映您的应用实际使用了多少物理内存。

注意:使用搭载 Android 8.0(API 级别 26)及更高版本的设备时,Memory Profiler 还会显示应用中的一些误报的原生内存使用量,而这些内存实际上是分析工具使用的。对于大约 100000 个对象,最多会使报告的内存使用量增加 10MB。在 IDE 的未来版本中,这些数字将从您的数据中过滤掉。

查看内存分配情况

内存分配情况图表为您显示内存中每个 Java 对象和 JNI 引用的分配方式。具体而言,内存分析器可为您显示有关对象分配情况的以下信息:

    分配了哪些类型的对象以及它们使用多少空间。
    每个分配的堆栈轨迹,包括在哪个线程中。
    对象在何时被取消分配(仅当使用搭载 Android 8.0 或更高版本的设备时)。

Activity 内存泄漏检测用法

主要用到Profiler模块:

接下来,我们先使用Profiler工具的Capture heap dump抓取一段内存堆数据:

总结

 Profiler工具为了我们能方便查看内存泄漏的地方,专门提供了一个View app heap 分类来报告哪些页面泄漏,同时,我们还可以在里面查看非页面类有没有正常被释放,比如单例,当我们退出某个功能后,手动把单例置为空(”销毁“),我们只需在强制GC后抓取一段内存数据查看该对象是否仍在活跃即可。

参考链接如下:
  原文链接:https://blog.csdn.net/WPR13005655989/article/details/129945991

  原文链接:https://blog.csdn.net/qq_31138209/article/details/139924593              
  原文链接:https://blog.csdn.net/WPR13005655989/article/details/129945991

  原文链接:https://blog.csdn.net/qq_31138209/article/details/139924593


http://www.ppmy.cn/embedded/137069.html

相关文章

SCUI Admin + Laravel 整合

基于 Vue3 和 Element Plus 和 Laravel 整合开发 项目地址:持续更新 LaravelVueProject: laravel vue3 scui

智慧场馆:安全、节能与智能化管理的未来

在当今社会,智慧场馆已经成为了现代场馆建设的一种重要模式。通过整合先进技术和智能系统,智慧场馆致力于提供全方位的解决方案,以实现场馆的安全性、节能性和智能化管理。本文将深入探讨智慧场馆如何实现安全、节能和全面智能化,…

弱口令整改方案:借助双因子认证加强账号密码安全

弱口令整改方案可借助宁盾 2FA双因子身份认证来解决。双因子认证(也称双因素身份认证)是一种安全认证机制,通过结合两个及以上不同的身份验证因子,提高企业用户在办公、研发、生产、运维场景下的的账号密码安全性。它可以有效防止…

Python实战项目:结合while循环和time模块的15个创意应用

Python 的 while 循环和 time 模块是非常实用的工具,可以用来创建各种有趣的应用。今天我们就来探索一下如何将这两个工具结合起来,实现一些创意十足的小项目。从简单的倒计时器到复杂的自动化任务,我们会一步步引导你完成这些项目。 1. 倒计…

【在Typora中绘制用户旅程图和甘特图】

在 Typora 中可以使用 Mermaid 绘制用户旅程图(User Journey Map),但由于 Mermaid 并不直接支持用户旅程图,我们可以通过一些图表的变通方式(比如流程图或甘特图)来表示用户旅程图的结构。用户旅程图通常展…

Oracle 外键

外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性 Oracle 外键创建 在Oracle数据库中,外键是强制实施参照完整性的一种方式,使用外键就意味着一个表中的值在另一个表中也必须出现。 被引用的表称为父表&#xff…

2024美亚个人

检材链接(来自美亚官方):https://pan.baidu.com/s/1ajsVB_15aJ4mzTvd5rHSkQ?pwd=pv1h 容器密码:eS2%u@q#hake2#Z@6LWpQ8^T(R7cg95m\Bv+y;$=/dqxYnEusFf)tb>:HKHwy+e%cR\r=9j:GsK)AV52/3hXfdv8#u7a6JQ^pz><YPNkq*!& 检材列表 Emma的iOS手机镜像档案(Emma_Mo…

后台管理系统窗体程序:文章管理 > 文章列表

目录 文章列表的的功能介绍&#xff1a; 1、进入页面 2、页面内的各种功能设计 &#xff08;1&#xff09;文章表格 &#xff08;2&#xff09;删除按钮 &#xff08;3&#xff09;编辑按钮 &#xff08;4&#xff09;发表文章按钮 &#xff08;5&#xff09;所有分类下拉框 &a…