前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >perfetto分析Native和java内存

perfetto分析Native和java内存

原创
作者头像
用户9505469
发布2024-04-10 17:20:09
4210
发布2024-04-10 17:20:09

Perfetto是一种用于分析Android操作系统性能的工具,由Google开发并开源。可以用于监测和分析Android设备的各种性能指标,如CPU使用率、内存使用情况、网络流量等等,并且可以将这些数据导出到其他工具中进行分析和可视化。下面简单阐述使用perfetto分析native和java内存的步骤

Native内存dump与分析

Native 内存分析要求设备为Android10及以上

应用程序通常通过malloc来获取native的内存,perfetto通过hook内存分配和释放的几个函数,得到native的内存信息。具体hook的方法可参考link

只有开始dump数据的时候,perfetto才会开始统计内存信息,因此在dump之前就已分配或释放的内存不会统计在内。可以使用下述两种方式获取trace文件

1. 使用命令获取一定时间段数据

代码语言:javascript
复制
adb shell perfetto \
  -c - --txt \
  -o /data/misc/perfetto-traces/trace \
<<EOF

buffers: {
    size_kb: 63488
    fill_policy: DISCARD
}
buffers: {
    size_kb: 2048
    fill_policy: DISCARD
}
data_sources: {
    config {
        name: "android.heapprofd"
        target_buffer: 0
        heapprofd_config {
            sampling_interval_bytes: 4096
            process_cmdline: "com.google.android.youtube"
            continuous_dump_config {
                dump_phase_ms: 1000
                dump_interval_ms: 5000
            }
            shmem_size_bytes: 8388608
            block_client: true
        }
    }
}
duration_ms: 30000

EOF

该命令获取目标应用30s内的内存分配情况,每隔5秒dump一次数据。最后trace数据会保存在手机目录下,使用adb命令pull即可。

2. 执行脚本获取数据

下载最新脚本heap_profile,执行 ./heap_profile -n com.google.android.youtube -c 5000 ,脚本会每隔5秒dump一次数据,直到用户按Control+C快捷键,停止dump。trace文件保存目录会在终端打印出来,也可执行脚本时添加-o参数保存到指定目录,该目录初始需要是空目录。

用perfetto打开得到的trace文件便可得到下图显示,每个结点即是每次dump的数据情况。

点击结点可在下方看到该次dump的内存火焰图情况

火焰图有四个指标可以查看:

Unreleased malloc size: 从录制开始到菱形所选结点对应时间,在此调用堆栈中分配但未释放的字节数。

Total malloc size: 从录制开始到菱形所选结点对应时间,在此调用堆栈上分配了多少字节(包括转储时释放的字节)。

Unreleased malloc count: 从录制开始到菱形所选结点对应时间,在此调用堆栈上还有多少没有释放的分配数量。

Total malloc count: 从录制开始到菱形所选结点对应时间,在这个调用堆栈上共完成了多少分配(包括有对应释放操作的分配)。

除了查看火焰图,还可以执行sql语句查询想要的数据。其主要数据存储在下述三张表中

stack_profile_frame:存储调用堆栈中具体某个函数的信息

stack_profile_callsite:存储调用堆栈的引用关系

heap_profile_allocation:存储一个调用堆栈的内存分配或释放大小

可以在perfetto网站中写sql语句查询,也可将trace文件转为数据库表,自己写脚本分析。

trace文件转sqlite数据库方法:使用trace_processor脚本,执行./trace_processor -e heap-profile.sqlite raw-trace可以在执行目录得到数据库文件。之后便可自己操作数据库查询想要的数据。

Java内存dump与分析

Java 内存分析要求设备为Android11及以上。

perfetto可直接将某一时刻的构成Java堆的所有Java对象大小、引用关系等dump下来。可以使用下述两种方式获取trace文件

1. 使用命令获取一定时间段数据

代码语言:javascript
复制
adb shell perfetto \
  -c - --txt \
  -o /data/misc/perfetto-traces/trace \
<<EOF

buffers: {
    size_kb: 63488
    fill_policy: DISCARD
}
buffers: {
    size_kb: 2048
    fill_policy: DISCARD
}
data_sources: {
    config {
        name: "android.java_hprof"
        target_buffer: 0
        java_hprof_config {
            process_cmdline: "com.google.android.youtube"
            continuous_dump_config {
                dump_phase_ms: 1000
                dump_interval_ms: 2000
            }
        }
    }
}
duration_ms: 30000

EOF

该命令获取目标应用Java内存占用情况,每隔5秒dump一次数据。最后trace数据会保存在手机目录下,使用adb命令pull即可。

2. 执行脚本获取数据

下载最新脚本java_heap_profile,执行 ./java_heap_profile -n com.google.android.youtube -c 5000 ,脚本会每隔5秒dump一次数据,直到用户按Control+C快捷键,停止dump。trace文件保存目录会在终端打印出来,也可执行脚本时添加-o参数保存到指定目录,该目录初始需要是空目录。

用perfetto打开得到的trace文件便可得到下图显示,每个结点即是每次dump的数据情况。

点击结点可在下方看到该次dump的内存火焰图情况

火焰图有两个指标可以查看

Size: 通过此条路径被GCRoots持有的对象字节大小

Objects: 通过此条路径被GCRoots持有的对象数量

除了查看火焰图,还可以执行sql语句查询想要的数据。其主要数据存储在下述三张表中

heap_graph_class:存储对象名称,class等相关信息

heap_graph_object:存储数据采样时间、对象大小、与根节点关系等信息,关联了对象引用关系表

heap_graph_reference:存储对象引用关系

trace文件转sqlite文件方法同上述native转换方法一致

注意事项:

1. 两种内存dump方式对Android版本都有要求,native要求10以上,Java要求11以上

2. debug包直接可以dump数据,如果是release包,需要在manifest文件中添加<profileable android:shell="true"/>声明

3. 如果是Android9或Android10设备,使用perfetto需要先执行adb shell setprop persist.traced.enable 1

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Native内存dump与分析
  • Java内存dump与分析
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档