MAT
列详细解析
| 列 | 说明 |
|---|---|
| Histogram | 根据以class为基本单位,来列举每个类各有多少个实例 |
| Dominator Tree | 从大到小列举出一些当前内存中占用最大内存的对象 |
| Top Consumers | 通过图像列出最大的Object |
| Leak Suspects | 通过MAT自动分析内存泄漏的原因和泄漏的一份总体报告 |
| Top Consumers | 通过图像列出最大的Object |
| 列 | 说明 |
|---|---|
| Shallow Heap | 是对象本身占据的内存的大小,不包含其引用的对象 |
| Retained Heap | 当前对象大小+当前对象可直接或间接引用到的对象的大小总和 |
| with incoming references | 显示选中对象被哪些对象持有 |
| with outgoing references | 显示选中对象持有了哪些外部对象 |
| Path to GC Roots | GC根路径 |
| Merge Shortest Paths to GC Roots | 合并GC根目录的最短路径 |
| exclude weak/soft references | 排除掉弱引用和软引用,因为他们不会造成内存泄漏 |
Perfetto
| 列 | 说明 |
|---|---|
| iq | input事件 |
| VSYNC-app | 它通知应用层(App)开始渲染下一帧。如果应用未在下一个 VSYNC 前完成渲染,可能会导致掉帧(jank)。有这个信号才会触发doFrame的出帧 |
| BufferTX | 对应应用的帧队列的。在VSYNC-APP 期间准备好的帧会进入这个队列 |
| VSYNC-sf | 从对应应用的帧队列(BufferTX)获取到一个buffer,获取不到就丢帧了 |
Perfetto Runnable状态
| 列 | 说明 | 作用 |
|---|---|---|
| 运行中(Running) | 只有在该状态的线程才可能在 cpu 上运行。而同一时刻可能有多个线程处于可执行状态,这些线程的 task_struct 结构被放入对应 cpu 的可执行队列中(一个线程最多只能出现在一个 cpu 的可执行队列中)。调度器的任务就是从各个 cpu 的可执行队列中分别选择一个线程在该cpu 上运行 | 作用:我们经常会查看 Running 状态的线程,查看其运行的时间,与竞品做对比,分析快或者慢的原因:1:是否频率不够?2:是否跑在了小核上?3:是否频繁在 Running 和 Runnable 之间切换?为什么?:4:是否频繁在Running 和 Sleep 之间切换?为什么?5:是否跑在了不该跑的核上面?比如不重要的线程占用了超大核 |
| Runnable | 线程可以运行但当前没有安排,在等待 cpu 调度 | 作用Runnable 状态的线程状态持续时间越长,则表示 cpu 的调度越忙,没有及时处理到这个任务是否后台有太多的任务在跑?没有及时处理是因为频率太低?没有及时处理是因为被限制到某个 cpuset 里面,但是 cpu 很满?此时 Running 的任务是什么?为什么?白色 : 休眠中Sleep线程没有工作要做,可能是因为线程在互斥锁上被阻塞,也可能等待某个线程返回,可以看是被谁唤醒,去查看是等待哪个线程。 |
| 休眠中(Sleep) | 线程没有工作要做,可能是因为线程在互斥锁上被阻塞,也可能等待某个线程返回,可以看是被谁唤醒,去查看是等待哪个线程。 | 作用 : 这里一般是在等事件驱动 |
| 不可中断的睡眠态Uninterruptible Sleep - IO Block | 线程在I / O上被阻塞或等待磁盘操作完成,一般底线都会标识出此时的 callsite :wait_on_page_locked_killable。 | 作用:这个一般是标示 io 操作慢,如果有大量的橘色不可中断的睡眠态出现,那么一般是由于进入了低内存状态,申请内存的时候触发 pageFault, linux 系统的 page cache 链表中有时会出现一些还没准备好的 page(即还没把磁盘中的内容完全地读出来) , 而正好此时用户在访问这个 page 时就会出现 wait_on_page_locked_killable 阻塞了. 只有系统当 io 操作很繁忙时, 每笔的 io 操作都需要等待排队时, 极其容易出现且阻塞的时间往往会比较长. |
| 不可中断的睡眠态Uninterruptible Sleep (non-IO) | 线程在另一个内核操作(通常是内存管理)上被阻塞。 | 作用:一般是陷入了内核态,有些情况下是正常的,有些情况下是不正常的,需要按照具体的情况去分析 |
Perfetto快捷键
| 列 | 说明 | 作用 |
|---|---|---|
| m | 临时 Mark 一段区域 | 用来上下看时间、看其他进程信息等。临时的意思就是你如果按 m 去 mark 另外一个区域,那么上一个用 m mark 出来的 Mark 区域就会消失。退出临时选中:esc ,或者选择其他的 Slice 按 m,当前这个 Slice 的选中效果就会消失 |
| shift + m | 是持续 Mark 一段区域 | 主要是用来长时间 Mark 住一段信息,比如你把一份 Trace 中所有的掉帧点都 Mark 出来,就可以用 shift + m,这样就不会丢失 |
| q | 隐藏和显示信息 Tab | 由于 Perfetto 非常占屏幕,熟练使用 q 键很重要,看的时候快速打开,看完后快速关闭。 |
分析 Perfetto 中 doFrame 耗时问题的方法
- 找到 UI 线程上的 Choreographer#doFrame 调用
- 展开调用栈查看耗时分布:
- 输入处理:input 阶段耗时
- 动画处理:animation 阶段耗时
- 视图测量布局:measure/layout 阶段耗时
- 绘制:draw 阶段耗时
- 同步:sync 阶段耗时
image.png








网友评论