关于slab_info中alloc_calls的变化及内存泄漏调试的技术咨询
关于slab_info中alloc_calls的疑问解答
1. 内存释放时alloc_calls计数是否会减少?
不会。alloc_calls统计的是内存分配操作的总调用次数,释放内存对应的是free_calls字段的增长,alloc_calls只会在调用分配API(如kmalloc、kmem_cache_alloc等)时递增,释放操作不会让它减少。你观察到的计数减少大概率是统计逻辑的特殊场景(比如某些内核版本的bug、或者特定slab缓存的重置),并非正常行为。
2. 卸载驱动后,API是否会从alloc_calls文件中消失?
是的。当驱动卸载后,它注册的slab缓存会被销毁,对应的分配/释放调用统计条目也会从/proc/slabinfo(或相关debugfs中的slab统计文件)中移除。如果驱动使用的是内核通用slab缓存(比如kmalloc-*系列),那对应的通用缓存条目不会消失,但驱动相关的调用计数会被清零或不再关联。
3. 利用alloc_calls调试内存泄漏的思路
- 对比
alloc_calls和free_calls的差值:如果某个API的alloc_calls远大于free_calls,且差值持续增大,大概率存在泄漏 - 结合
slabinfo中的active_objs和num_objs字段:如果active_objs一直居高不下,且和alloc_calls - free_calls的差值匹配,可定位到对应的slab缓存 - 开启内核调试配置辅助:比如开启
CONFIG_SLUB_DEBUG,通过/sys/kernel/slab/<cache_name>/alloc_calls查看具体调用栈,或者用kmemleak工具直接检测泄漏(需要内核配置支持)
注意:不同内核版本的slab统计逻辑可能有差异,部分旧版本内核的
alloc_calls实现可能不够完善,建议结合对应内核版本的文档验证。
内容的提问来源于stack exchange,提问作者samp lin
相关产品推荐
相关产品推荐

