Systemui hprof分析实操(kotlinx.atomicfu.AtomicRef)

来源飞书 wiki(obj_token: JNODdHzN1oSEd5x5ZePcedtmndf)

文档中所有 5 张图片均因飞书接口 403 下载失败,已保留为占位引用(图片描述由飞书 doc_fetch 自动生成)。

排名第一,差7万个对象,内存差1.2M

📷 图片描述: 图片展示的是Excel表格界面,表格中列出了不同类名及其相关数据。关键信息有:Class Name为kotlinx.atomicfu.AtomicRef,Objects #1 Objects #2 Shallow Heap Shallow Heap GC #1 Retained Heap GC #2 - 1等列数据,其中Objects 1列数字为176707,Objects 2列数字为77946,Shallow Heap列数字为2827312,Retained Heap列数字为1247136。该图片与文档中对kotlinx.atomicfu.AtomicRef原子引用类型的介绍相关,可能用于辅助说明其在系统内存分析中的数据表现。(token SjtsbHRl1oAUPLxNemycByofnNc,下载失败)

kotlinx.atomicfu.AtomicRef:原子引用类型,用于在多线程环境下安全地管理对象引用的读写操作,避免竞态条件,其核心价值是通过底层原子指令(如 CAS、Load-Link/Store-Conditional 等)保证引用操作的原子性,无需显式加锁(实现无锁并发)。

根据Systemui Java堆-Hprof对比分析,查找最短根引用,排第一6万个对象miui.telephony.SubscriptionManagerEx$Holder,该类对象引用magic不存在,重点排查

📷 图片描述: 图片展示的是Lombok Memory Analyzer工具界面,用于分析Hprof文件。界面中以表格形式呈现了类名、引用对象数量、浅堆大小等信息。其中,miui.telephony.SubscriptionManagerExHolder,该类对象引用magic不存在,重点排查的内容相关,直观呈现了该类对象的分析数据。(token Ccs5bDnzjo51slx0B26cXgojnDh,下载失败)

继续展开:最顶层的 miui.telephony.SubscriptionManagerEx$Holder 是一个系统类单例,它持有 CONTEXT(android.systemui.SystemUIApplication)的强引用,导致整个应用的上下文无法被 GC 回收。

CONTEXT 又引用了 mSysUIComponent(Dagger 生成的依赖注入容器),进而引用了大量 dagger.internal.DoubleCheck 包装的对象provider

📷 图片描述: 图片展示的是SystemUI hprof分析中AtomicRef的引用链情况。界面中以树状结构呈现,显示了多个类名及其引用的类、引用对象数量、浅堆占用量等信息。关键部分是“mSysUIComponent”类,其引用了大量dagger.internal.DoubleCheck包装的对象provider,如“mMobileInteractionProvider”等,每个provider持有多个ReadonlyStateFlow实例。该图与上下文紧密相关,用于说明systemui业务侧引用持有结构,以及测试机与对比机在使用dagger框架上的差异,可作为优化参考。(token ZZDbb4qEMoeMEJxRNgWcrtlkn8b,下载失败)

继续再展开:基本都是相同的引用持有结构,dagger单例、每个provider持有多个ReadonlyStateFlow 实例

在systemui业务侧是否可以根据这个分析路径,说明和对比机的差异、是否可以优化等

比如:测试机使用dagger框架,对比机不使用此框架

📷 图片描述: 图片展示了systemui业务侧引用链中的部分对象。上半部分以“wifiViewModelProvider dagger internal DoubleCheck”为起点,包含多个kotlin.coroutines.flow.ReadonlyStateFlow实例,如initLeft、initRight等,以及mSysUIComponent等对象。下半部分以“mobileTelecomContractProvider dagger internal DoubleCheck”为起点,同样包含多个kotlin.coroutines.flow.ReadonlyStateFlow实例,如filteredSubscriptions、mobilesDefault等。这些对象的引用数量在200 - 340不等,图片与文档中关于systemui业务侧引用链分析的内容相关,用于说明业务侧引用持有结构及对象引用情况。(token RlckbHPDnofy4zxuPdscpUqunAh,下载失败)

如果想要查看完整的引用链,方便定位代码:

📷 图片描述: 图片展示的是SystemUI hprof分析中关于AtomicRef的引用链分析界面。画面中以树状结构呈现引用关系,如mSysUIComponent引用了DaggerReferenceGlobalRootComponent$ReferenceSysUIComponentImpl等对象。右上角有“Referenced Objects”和“Referencing Objects”两个选项,当前选中“Referenced Objects”。画面底部有“Total: 6 entries”等信息,还列出了多个对象及其引用数量。该图与文档中关于SystemUI hprof分析的内容相关,可帮助分析者查看引用链,定位代码。(token Smy3bOxHdoPjArxGHRocM9aBnae,下载失败)