作者:liu2guang
上期回顾:嵌入式中是否应该使用动态内存?
之前探讨了关于动态内存的东西,那么我们回到本次的主题内存泄漏。笔者前面说到使用RTOS无法避免的会有内存泄漏,所以我们需要找一种手段来查找内存泄漏并修复。笔者多次提到了内存泄漏,那内存泄漏到底是什么呢?
什么是内存泄漏
1
简单的来说内存泄漏就是应该释放的内存没有释放,那么我们回头来考虑在没有MMU的RTOS,由于分配的地址都是真实的物理地址,一段代码的所有内存都没有释放,系统的内存就会变得越来越少,最终没有内存可以使用。

最终的现象是在RT-Thread的msh上执行free命令可以看到系统没有可用的内存,效果如下:
1memheap pool size max used size available size
2-------- ---------- ------------- --------------
3sram1 131072 131000 72
4heap 413872 413000 872
除此之外还有一种泄漏,一段代码的部分内存没有释放,随着这块代码反复调用,内存区域被划分成了n个小块。通过free命令可以看到系统中可能还有很多内存,但是这个时候分配一个大内存的区域就可能会分配失败,因为虽然系统总内存是大于你需要分配的内存大小的,但是最大的连续块缺比你需要分配的小,这种情况也被叫做内存碎片。在RT-Thread的内存策略中只有连续的小块内存会在空闲线程中被整合成一块大内存,同时由于没有MMU所以无法利用物理与虚拟地址的转换在后台将小块内存自动整合成大内存。所以这种内存泄漏也是比较难查的问题之一,哪怕一段代码中分配了100块不同大小的内存,其中有一块没有释放也会导致系统没有大内存可用,只是时间问题。

1memheap pool size max used size available size
2-------- ---------- ------------- --------------
3sram1 131072 31000 100072
4heap 413872 313000 300872
根据上图我们可以知道,系统中虽然有400K的内存,但是这400K的内存可能是被分成了100块区域,最终的区域可能只有4K左右,那么这个时候我去分配8K 10K 20K都肯定是失败的,这种内存泄漏一般在设备运行的早期不会出现,随着运行的时候越长就越容易出现。
小内存管理算法<

本文探讨了在RT-Thread操作系统中如何定位和解决内存泄漏问题。通过理解内存泄漏的原理,分析动态内存分配特点,结合RT-Thread的小内存管理算法和memtrace功能,可以有效地找出内存泄漏点,确保系统稳定运行。
最低0.47元/天 解锁文章
7833

被折叠的 条评论
为什么被折叠?



