Memory

作者: StyleShu | 来源:发表于2025-07-12 22:33 被阅读0次

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

相关文章

网友评论

      本文标题:Memory

      本文链接:https://www.haomeiwen.com/subject/bzyknjtx.html