前言:虽然有翻译软件,虽然有chatgpt,毕竟语言隔阂,对这个工具还是一知半解,因此想通过翻译的方式和大家来一起学习下Perfetto这个强大的工具
#####################以下分割线#####################
英文原文在这里
NOTE: 抓取 Java heap dumps 需要 Android 11 或更高的系统
有关Java heap dumps的入门信息,请参阅内存指南。
与 Native heap profiles相反,Java heap dumps 显示存活对象的内存,但不显示调用堆栈。Java heap dump中记录的信息形式如下:对象X通过其名为Z的类成员保留了N字节大的对象Y。
Java heap dumps不能与 Java heap sampler混淆
UI
单击进程的"Heap Profile"轨迹中的菱形后,Heap graph dumps在UI中显示为火焰图。每个菱形对应一个heap dump。
java-heap-graph (1).png
某些native对象的大小在火焰图中表示为一个额外的子节点,前缀为“[na't've]”。额外的节点算作额外的对象。这仅在Android 13及更高版本上可用。
SQL
有关Java堆的信息写入以下表格:
native_size(仅在Android T+上可用)是从相关的libcore.util.NativeAllocationRegistry中提取的,不包含在self_size中。
例如,要获取类名使用的字节数,请运行以下查询。这个查询通常会返回不实用的信息,因为Java堆中的大多数字节最终实际都是基本对象数组或字符串。
select c.name, sum(o.self_size)
from heap_graph_object o join heap_graph_class c on (o.type_id = c.id)
where reachable = 1 group by 1 order by 2 desc;
java heap dump_1.png
我们可以使用experial_framegraph将图规范化为树,然后采用到GC Root的最短的路径,然后获得累积大小。请注意,这是实验性的,API可能会更改。从中我们可以看出每种类型的对象都拥有多少内存
为此,我们需要找到图的时间戳和upid。
select distinct graph_sample_ts, upid from heap_graph_object
graph_sample_ts | upid |
---|---|
56785646801 | 1 |
然后我们可以使用它们来获得火焰图数据。
select name, cumulative_size
from experimental_flamegraph
where ts = 56785646801
and upid = 1
and profile_type = 'graph'
order by 2 desc;
java heap dump_2.png
TraceConfig
Java heap dump采集的数据来源在 JavaHprofConfig 这里配置。
data_sources {
config {
name: "android.java_hprof"
java_hprof_config {
process_cmdline: "com.google.android.inputmethod.latin"
dump_smaps: true
}
}
}
#####################以上分割线#####################
后记:
1 本次主要使用百度翻译,虽然被骂,但至少翻译这个工具降低了门槛。
2 英文文档中的长难句真的是又长又难,基于百度的翻译,然后自己再调整下,水平实在有限。
3 技术背景知识不够,有些专有名词不知道怎么翻译,也不知道百度翻译的是否准确,功夫在诗外。
4 万事开头难,中间难不难,还不知道。中间的事后面再说,正确一天翻译一篇。
5 虽然可能会有人不屑,但总要有人去做不起眼的小事。
6 google 厉害,这个perfetto 工具也很厉害。君子善假于物也。
7 工具的使用是最简单的入门,背后还有更多的东西值得学习。
8 水平实在有限,闻过则喜,希望有更多的人反馈,期待更好的建议
网友评论