Android perfetto - 记录分析memory

1、简介

Android perfetto - Perfetto 新手入门指南中初步介绍了Perfetto 是一个强大的性能分析工具,能够帮助开发者捕捉、分析 Android 系统和应用的性能数据。Android perfetto - 什么是 Tracing又介绍了Tracing和Profiling的区别,这篇文档将从分析内存的角度,以memory profiling为切入点展示如何使用 Perfetto 记录和分析内存使用情况。

2、内存分析概述

在 Android 应用中,内存的使用主要涉及两个方面:

  1. Native C/C++/Rust 进程 :通常通过 libc 的malloc/free(或者 C++ 的new/delete等包装函数)来分配内存。请注意,即使使用 Java API(通过 JNI 相关函数实现),也可能进行原生内存分配。一个典型的例子是java.util.regex.Pattern,它通常同时拥有 Java 堆内存和原生内存,因为底层使用了原生正则表达式库。
  2. Java/KT 应用 :应用的内存占用的很大一部分存储在管理堆中(在 Android 中由 ART 的垃圾回收器管理)。这是每个new X() 对象所在的地方。

Perfetto 提供两种互补的内存分析方式:

  1. heap profiling 原生堆分析:通过采样malloc/free 调用的调用栈,生成内存使用的火焰图,帮助诊断内存泄漏和优化内存分配。
  2. heap dumps Java 堆转储:生成堆保留图,分析 Java 对象的生命周期和内存保留链,帮助发现内存泄漏和无用对象的持有。

3、Perfetto 内存分析模式

3.1、原生堆分析Native (C/C++/Rust) Heap Profiling

原生语言(如 C/C++/Rust)通常通过 malloc/free 等函数进行内存分配。Perfetto 在 Android 和 Linux 系统上拦截这些函数的调用,通过采样内存分配时的调用栈来追踪每个内存分配的位置。此分析可以帮助您了解哪些函数导致了大量的内存分配,或者是否存在未释放的内存(即内存泄漏)。

  • 支持的平台 :仅支持 Android 和 Linux,因其依赖于拦截malloc/free 函数。
  • 工作原理 :通过采样malloc和free 的调用栈,Perfetto 能够追踪内存分配的来源。
  • 注意事项:堆分析是非追溯性的,只能记录追踪开始后的内存分配,无法提供启动前的内存使用情况。

3.2、Java 堆转储Java/Managed Heap Dumps

对于 Java 和 Kotlin 应用,Perfetto 可以创建堆转储,分析对象的生命周期和引用关系。堆转储提供了 Java 堆的详细快照,帮助开发者发现内存泄漏和不必要的对象引用。

  • 支持的功能:通过分析对象之间的引用链,Perfetto 可以生成内存保留图,帮助分析哪些对象被长期持有。
  • 注意事项:堆转储分析不提供调用栈信息,因此不适合用于追踪原生代码的内存分配情况。

3.3、如何抓取

参考Android perfetto - Perfetto 新手入门指南 中介绍的抓取方法,在config中添加面配置即可

yaml 复制代码
data_sources {
  config {
    name: "android.heapprofd"
    heapprofd_config {
      sampling_interval_bytes: 4096
      process_cmdline: "system_server"
      process_cmdline: "com.android.systemui"
      process_cmdline: "com.example.myapplication"//改成自己的进程名字即可
      continuous_dump_config {
        dump_phase_ms: 1000
        dump_interval_ms: 1000
      }
      shmem_size_bytes: 8388608
      block_client: true
      all_heaps: true
    }
  }
}

data_sources {
  config {
    name: "android.java_hprof"
    java_hprof_config {
      process_cmdline: "system_server"
      process_cmdline: "com.android.systemui"
      process_cmdline: "com.example.myapplication"//改成自己的进程名字即可
      dump_smaps: true
      continuous_dump_config {
        dump_phase_ms: 1000
        dump_interval_ms: 1000
      }
    }
  }
}

抓取要求:

  • 在用户版本(user)上,只有标记为 profileable或debuggable 的应用才能进行内存分析。
  • 在userdebug 版本 上,所有应用(除了少数关键服务)都可以被分析。
  • 可以通过禁用 SELinux 或使用--disable-selinux 参数解除分析限制。
  • 要标记应用为可分析,只需在应用的清单文件中添加<profileable android:shell="true"/>。
xml 复制代码
<manifest ...>
    <application>
        <profileable android:shell="true"/>
        ...
    </application>
</manifest>

4、参考

相关推荐
极限实验室11 小时前
Easysearch 布尔查询子句重排序(二)|ConjunctionDISI 按 cost 排序源码解析
后端·搜索引擎·性能优化
哲鲤13 小时前
Binder 不只是 IPC:从一次跨进程调用看懂 Android 与 AAOS 的架构演进
android
用户1281397781613 小时前
Eyf半字节【3.0 版】正式发布|订单、单证、扫码三大核心模块全新重构
android
device_Any14 小时前
接口文档写着三个字段,接口返回了五个
android·java·linux
CCblandy14 小时前
缓存淘汰实测:一次全表扫描把 LRU 命中率从 46% 打到 38%,W-TinyLFU 守住 50% 却贵 11 倍
后端·python·缓存·性能优化·架构
kingx314 小时前
Bugku Reverse 与 Android 题解总集:APK / native / PE / IPA
android·逆向·ctf·bugku
大尚来也14 小时前
PHP 内存溢出常见原因与优化排查步骤
android
美狐美颜SDK开放平台15 小时前
开发直播APP、电商短视频与视频社交平台时,能否共用一套美颜SDK?
android·图像处理·人工智能·音视频·直播美颜sdk
事圆则缓15 小时前
Android 中的 MQTT 协议:从设备状态推送到可靠消息处理
android
三雷科技16 小时前
Android 开发环境搭建指南
android