程序的内存使用量随着时间的推移而增加,但内存泄漏工具报告没有问题

Memory usage of program increasing over time, but memory leak tools report no issues

本文关键字:内存 泄漏 工具 有问题 增加 报告 使用量 时间 程序      更新时间:2023-10-16

我正在开发一个相当大的库,它在执行时不断分配和释放内存。在过去的几周里,我一直在努力保持内存消耗稳定,但它似乎随着时间的推移而增加。我无法完全解释的行为是增加不是线性的。有一个"基线"内存级别,进程在一段时间内徘徊,然后跳转到新的"基线"。随着时间的流逝,跳跃需要越来越多的内存。因此,假设在运行几个小时后,内存使用量从 512kb 跃升至 1024kb。它可能会从 1024 点到 2048 个过夜时间。然后下次可能会跳到 4096kb。下面是内存使用情况的图表:

内存使用情况图表

我让它在Linux上运行,Valgrind给了它一个干净的健康账单,如果这是相关的。我在这里使用 Linux 代码来显示我的进程的虚拟内存消耗:

int getValue(){ //Note: this value is in KB!
FILE* file = fopen("/proc/self/status", "r");
int result = -1;
char line[128];
while (fgets(line, 128, file) != NULL){
    if (strncmp(line, "VmSize:", 7) == 0){
        result = parseLine(line);
        break;
    }
}
fclose(file);
return result;

您很可能患有内存碎片

发生的情况是,当您释放内存块时,您会遇到一些小孔,下次请求内存时可能无法使用。 当您继续以创建小不可用孔的模式进行分配和释放时,唯一的解决方案是从系统中获取更多内存。

如果您对程序如何将内存用于特定事项有明确定义的规则,则可能需要考虑使用内存来帮助根据程序的特定要求分配和释放内存,而不是标准库的通用要求。