File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -2628,11 +2628,12 @@ <h3 id="ai-bug"><a href="https://mp.weixin.qq.com/s/kXkKTLMMTcJSpBE3bQiEFg">让A
26282628< p > < img alt ="" src ="https://hub.gitmirror.com/raw.githubusercontent.com/RicardoJiang/resource/refs/heads/main/2025/november/p3.webp " /> </ p >
26292629< p > ### < a href ="https://juejin.cn/post/7560986017034616875 "> 穿越二十年:Android Native 内存泄漏检测的进化之路</ a >
26302630过去二十年,Android Native(C/C++)内存泄漏检测方案不断发展。从Valgrind开启先河,到LSan改进性能,再到libmemunreachable实现零开销运行,平台侧方案不断演进。同时,App侧方案也因应不同的内存泄漏理解分为语义泄漏和业务泄漏两类。Valgrind作为初代工具,是宿主进程加虚拟执行框架,通过运行时拦截和检测实现泄漏检测,但性能较差。LSan借助LLVM在编译期插桩,提升了性能。libmemunreachable则针对Android系统native组件泄漏问题,通过独特方式实现零开销检测。App侧方案中,KOOM类似平台侧进行可达性分析检测语义泄漏,MemoryLeakDetector和Matrix通过统计分析检测业务泄漏。这二十年的发展是系统软件工程在可见性与代价间的博弈,体现了系统复杂性与工程现实的平衡艺术。</ p >
2631- < p > < strong > 重要亮点</ strong >
2632- - < strong > Valgrind的原理与意义</ strong > :诞生于2000年,旨在为Linux搭建通用动态分析框架。它并非普通调试器,而是通过将原生机器码翻译为VEX IR并插入检测逻辑,再编译回机器码执行。泄漏检测分运行时记录分配信息,检测时构建可达性根集并扫描标记,确立了内存泄漏检测核心范式。例如运行时记录malloc/new及对应free/delete信息,检测时冻结程序状态构建根集。
2633- - < strong > LSan对Valgrind的改进</ strong > :因Valgrind性能问题,随着LLVM兴起,LSan应运而生。它在编译期插桩,取代运行时虚拟执行,性能大幅提升。如AddressSanitizer将检测逻辑嵌入编译指令流,LSan借助其基础检测泄漏。不过,两者在分配追踪和根集合获取方式上有分歧,LSan虽性能好但有部分泄漏默认不报告。
2634- - < strong > libmemunreachable的创新</ strong > :2016年为解决Android系统native组件泄漏检测难题诞生。它不依赖编译器,不追踪分配,检测时向分配器索取活跃分配表,并将标记扫描移到子进程,实现零开销。例如检测时创建collector和sweeper进程,collector采集信息后fork出sweeper分析,主进程不受干扰。
2635- - < strong > App侧方案的分类依据</ strong > :因对内存泄漏理解不同分为两类。语义泄漏以KOOM为代表,类似平台侧进行可达性分析;业务泄漏以MemoryLeakDetector和Matrix为代表,通过记录存活对象、栈聚合和趋势分析定位泄漏热点。语义泄漏关注对象是否可达,业务泄漏关注对象存在是否合理。 </ p >
2631+ < ul >
2632+ < li > < strong > Valgrind的原理与意义</ strong > :诞生于2000年,旨在为Linux搭建通用动态分析框架。它并非普通调试器,而是通过将原生机器码翻译为VEX IR并插入检测逻辑,再编译回机器码执行。泄漏检测分运行时记录分配信息,检测时构建可达性根集并扫描标记,确立了内存泄漏检测核心范式。例如运行时记录malloc/new及对应free/delete信息,检测时冻结程序状态构建根集。</ li >
2633+ < li > < strong > LSan对Valgrind的改进</ strong > :因Valgrind性能问题,随着LLVM兴起,LSan应运而生。它在编译期插桩,取代运行时虚拟执行,性能大幅提升。如AddressSanitizer将检测逻辑嵌入编译指令流,LSan借助其基础检测泄漏。不过,两者在分配追踪和根集合获取方式上有分歧,LSan虽性能好但有部分泄漏默认不报告。</ li >
2634+ < li > < strong > libmemunreachable的创新</ strong > :2016年为解决Android系统native组件泄漏检测难题诞生。它不依赖编译器,不追踪分配,检测时向分配器索取活跃分配表,并将标记扫描移到子进程,实现零开销。例如检测时创建collector和sweeper进程,collector采集信息后fork出sweeper分析,主进程不受干扰。</ li >
2635+ < li > < strong > App侧方案的分类依据</ strong > :因对内存泄漏理解不同分为两类。语义泄漏以KOOM为代表,类似平台侧进行可达性分析;业务泄漏以MemoryLeakDetector和Matrix为代表,通过记录存活对象、栈聚合和趋势分析定位泄漏热点。语义泄漏关注对象是否可达,业务泄漏关注对象存在是否合理。 </ li >
2636+ </ ul >
26362637< p > < img alt ="" src ="https://hub.gitmirror.com/raw.githubusercontent.com/RicardoJiang/resource/refs/heads/main/2025/november/p4.webp " /> </ p >
26372638
26382639 < hr >
Load diff Large diffs are not rendered by default.
You can’t perform that action at this time.
0 commit comments