我从 RTOS 分配了一个大内存池(我已经知道我的应用程序内存需求,它不会增长超过一定大小)。然后我的应用程序分配请求从该池中得到满足。
最近我开始遇到一个问题;即使内存存在,分配请求也没有得到满足(集成内存基准标记框架,这表明了这一点),调查显示我们正在遭受内存碎片的困扰。
我的应用程序严重依赖STL(还从网络接收数据,XML解析,图像处理,将其保存为PNG等),以及内存碎片背后的堆内存分配(还有其他原因吗?),什么是最好的避免的方法?
最佳答案
内存碎片的典型原因是随着池的老化,大内存块被分成越来越小的 block 。避免这种情况的简单方法是使用固定尺寸。
这显然不能解决 XML 使用 18MB 存储的问题,其中每个 XML 节点都存储为一个小字符串,然后尝试加载 4096 x 4096 x 8 位 PNG(16MB),如果你的池是 24MB ,因为 XML 会将您的内存分成小块,然后您需要 16MB 的连续内存。但是“固定大小”将避免 <aaa>b</aaa>
的 XML 字符串占用 4 字节和 2 字节的内存,从而使内存对于存储在那里的任何其他内容完全无用,因为没有其他对象是 4 或 2 字节长的。
此方法将要求您的内存分配器本身被写入以考虑“固定大小”。
关于c++ - 避免内存碎片的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15848552/