1. 项目背景
自定义内存池是为了解决 C++ 程序中频繁调用malloc/free带来的性能开销、内存碎片问题而开发的底层内存管理组件。
- 解决的核心问题:
- 频繁堆内存分配导致的系统调用开销大、程序运行效率低
- 零散内存分配产生的内存碎片,降低内存利用率
2. 项目介绍
该项目是基于定长内存池设计,在多核多线程下实现了一套较高效率的高并发内存池。通过借鉴 tcmalloc 的核心思想,设计了三级缓存架构(线程缓存→中心缓存→页缓存),在保证线程安全的前提下,大幅提升了内存分配与回收的吞吐率,同时有效控制了内存碎片化
架构设计:
- 核心架构: 由线程缓存、中心缓存、页缓存三级缓存组成,既保证高并发下的效率,又能保证内存利用率
- 内存碎片处理: 内碎片靠 “分级对齐“,外碎片靠“页缓存合并“处理,同时缓存复用从源头减少碎片产生
- 高并发模式: 高频小对象走“线程缓存” 无锁操作,偶尔缺内存,批量向“中心缓存”申请(桶锁);中心缓存缺内存向 页缓存整页申请。大对象直接走 页缓存/系统(跳过中间层,减少竞争)
3. 测试计划
3.1 测试目标
- 验证内存池基础功能正确性:申请、释放等核心功能正常,无崩溃、无内存泄漏
- 验证内存池线程安全性:多线程并发申请/释放时,无崩溃、无死锁、无数据竞争
- 验证内存池性能表现:对比系统 malloc/free ,多线程性能优于系统malloc
3.2 测试范围
- 功能测试:单次申请/释放、批量申请/释放、内存池耗尽-释放-恢复、随机大小申请/释放、异常场景测试
- 安全测试:循环分配/释放和多线程并发分配/释放,是否存在内存泄漏,线程安全问题
- 性能测试:对比系统 malloc/free ,测试内存池的分配/释放耗时
4. 测试工具

5. 设计到的测试动作/类型

测试用例覆盖说明:
- 功能测试:覆盖正常大小内存申请/释放、内存池循环复用、数据读写验证、随机大小分配、边界测试、异常场景(空指针/重复释放)等核心功能,共20+个用例
- 安全测试:覆盖内存泄漏检测、多线程并发申请/释放、线程安全等场景
- 性能测试:覆盖对比测试(内存池 vs malloc)、耗时统计、高并发性能等场景
6. 项目测试Bug
| Bug编号 | 严重程度 | 修复状态 | Bug描述 | 复现步骤 | 预期结果 | 实际结果 |
|---|---|---|---|---|---|---|
| 1 | 崩溃 | 已修复 | 申请256KB内存时,程序崩溃 | 调用MALLOC(256*1024)申请256KB内存 | 成功分配 | 程序崩溃 |
| 2 | 一般 | 未修复 | 对同一块内存执行2次free操作,内存池未拦截该非法操作,程序无崩溃但存在内存结构损坏风险 | 调用MALLOC(128)申请128B内存; | 内存池拦截重复释放,程序不崩溃 | 重复释放无任何拦截,程序正常运行 |
| 调用FREE(PTR)正常释放; | ||||||
| 再次调用FREE(ptr)重复释放 | ||||||
| 3 | 一般 | 未修复 | 调用FREE(nullptr)时,触发assert(it!=nullptr)断言,程序崩溃 | 直接调用FREE(nullptr) | 内存池安全处理空指针,不崩溃 | 触发断言,程序异常退出 |
| 4 | 严重 | 未修复 | 当工作线程退出时,线程本地缓存中仍持有未使用的内存块,未回收到中心缓存,导致这部分内存永久无法复用、无法释放,产生内存泄漏 | 一个线程调用MALLOC(64)申请100次内存; | 线程退出,线程缓存自动将剩余内存归还给中心缓存,无内存泄漏 | 线程退出后,线程缓存销毁,但持有的内存块未回收,造成内存泄漏 |
| 调用FREE(ptr)释放50次内存; | ||||||
| 最后线程退出看申请和释放次数 | ||||||
| 5 | 一般 | 未修复 | 当内存池向系统申请内存失败(超过最大限制)时,没有返回nullptr,而是直接抛异常,导致上次调用不捕获异常就会直接崩溃 | 不断申请内存,耗尽内存池上限; | 申请失败,返回nullptr,上次判断返回值即可,程序不崩溃 | 申请失败,直接抛异常,未捕获则程序崩溃 |
| 继续申请内存; | ||||||
| 内存池向系统申请失败; | ||||||
| 代码中执行了throw异常 |
7. 测试结论
本次项目测试通过,项目开发耗时1个月,项目测试耗时3天。
本次对自研高并发内存池进行了功能测试、安全测试、性能测试。测试结果表明,内存池的核心功能(内存申请、释放、内存块复用)均可正常工作,在多线程高并发场景下性能明显优于系统malloc,能够有效降低多线程锁竞争带来的性能损耗。
但在测试过程中也发现了若干影响稳定性和安全性的问题:
- 线程退出时,线程缓存所持有的内存块未回收到中心缓存,导致长期运行下出现内存泄漏
- 申请内存超过内存池最大限制时,内存池未按常规返回nullptr,而是直接抛异常,影响上层调用健壮性
综合评估:
本内存池核心功能正常,高并发性能优势明显,但在内存泄漏与异常处理规范上仍存在缺陷,整体满足设计目标,测试通过。部分模块可进一步优化,以提升长期运行稳定性。

396

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



