【发布时间】:2016-01-20 17:34:32
【问题描述】:
我有一个 C++ 进程,它摄取大块数据并将它们存储在内存中。存储阵列包含大约 10 GB 的数据,划分为 4 MB 的块。当新数据到达时,它会创建一个新块,然后如果旧块已满,则删除它。此过程每 10 - 60 秒循环一次完整的循环缓冲区。我们在 x86_64 RH5 和 RH6 上运行,并使用 Intel 14 编译器进行编译。
我们看到了一个问题,即整个进程的内存使用量会随着时间的推移而增长,直到操作系统内存不足并最终导致机器死机。我们一直在寻找内存泄漏并通过 TotalView 运行进程,试图确定内存的去向,但没有看到任何报告的泄漏。
在总视图生成的堆报告中,我们看到为存储的数据分配了 10GB 的内存,但我们也看到了 4+GB 的“释放”内存。查看堆显示,我们的堆看起来非常碎片化。会有一大块“已分配”内存穿插着大块“已释放”内存。
-
我的进程已释放但操作系统未回收的“已释放”内存是否合理认为这可能是我们的内存“泄漏”的来源?
如果是这样,我如何让操作系统回收内存?
我们是否需要重新设计流程以重用丢弃的数据块,而不是依赖操作系统为我们进行内存管理?
【问题讨论】:
-
如果内存消耗不断增加,这通常意味着您
new占用了一些内存,而永远不会delete它。您是否尝试过使用 gdb 之类的东西? -
我们一直在运行 TotalView 提供的内存分析和泄漏检测工具,它没有报告任何未删除的消息。我还将 cerr 放入数据块的构造函数和析构函数中,以验证我们没有丢失任何数据。
-
您在编写什么样的 C++ 应用程序?一台数据服务器,还是一台 HPC(数值计算)服务器?它运行多长时间(几小时或几个月)?
-
我认为没有避免碎片的“最佳”方法,但如果有许多大小相同的块,池化分配器可能是个好主意。
-
@mjr:您的问题不是通用的 C++ 问题(如果您没有真正的泄漏),而是取决于(1)您的操作系统,(2)您的 C++ 实现,以及(3)可能您的 C 实现可能会为 C++ 实现提供
malloc和free。没有这 2 或 3 个参数,这个问题是不完整的,无法回答。
标签: c++ memory-management memory-leaks