[Android稳定性] 第014篇 [问题篇] slab内存泄露 8月前查看 评论
[Android稳定性] 第014篇 [问题篇] slab内存泄露

**问题描述**: 系统出现Slab内存占用过高,初步分析发现`kmalloc-128`存在内存泄漏问题。日志分析显示`pd_dbg_info`函数申请内存次数远大于释放次数,怀疑存在内存泄漏。 **问题分析**: * **日志分析**: 通过分析`meminfo`和`slabinfo`日志,发现`kmalloc-128`内存占用持续增加,初步判断存在内存泄漏。 * **Slabtrace日志**: `pd_dbg_info`函数申请内存次数达到3761872,而释放函数`print_out_dwork_fn`只释放了224862次,存在大量内存未释放。 * **根本原因**: `pd_dbg_info`函数申请内存后,通过`print_out_dwork_fn`工作队列函数释放内存。由于`print_out_dwork_fn`会统计printed次数,超过`dbg_log_limit`后启动延迟队列,导致内存释放延迟,最终造成内存泄漏。 **解决方案**: * **调整`dbg_log_limit`**: 根据实际情况调整`dbg_log_limit`值,避免延迟队列启动,及时释放内存。 * **优化工作队列**: 优化`print_out_dwork_fn`工作队列,提高内存释放效率。 * **内存泄漏检测**: 使用内存泄漏检测工具,例如Valgrind,对代码进行检测和修复。 **总结**: 该问题是由于`pd_dbg_info`函数申请内存后,延迟释放导致的内存泄漏。通过调整`dbg_log_limit`、优化工作队列和进行内存泄漏检测,可以有效解决该问题。