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

时间:2016-02-15 00:55:56

标签: c++ linux memory memory-leaks

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

chart of memory usage

我在Linux上运行它并且Valgrind给它一个干净的健康状况,如果这是相关的。我正在使用Linux代码here来显示我的进程的虚拟内存消耗:

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;

1 个答案:

答案 0 :(得分:4)

您最有可能遭受内存碎片

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

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