我正在开发一个相当大的库,它在执行时不断分配和释放内存。在过去的几周里,我一直在努力保持内存消耗稳定,但它似乎随着时间的推移而增加。我无法解释的行为是增长不是线性的。有一个"基线"进程在一段时间内徘徊的内存级别,然后跳转到新的"基线"。随着时间的推移,跳跃需要越来越多的记忆。因此,让我们说在运行几个小时后,内存使用量从512kb跃升至1024kb。隔夜时间可能从1024到2048。然后下次可能会跳到4096kb。以下是内存使用情况的图表:
我在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;
答案 0 :(得分:4)
您最有可能遭受内存碎片。
当您释放内存块时,会发生一些漏洞,这些漏洞可能无法在您下次请求内存时使用。当您继续以创建小的不可用孔的模式分配和释放时,唯一的解决方案是从系统中获得更多的内存。
如果您有关于程序如何将内存用于特定事物的明确规则,您可能需要考虑内存池以根据程序的特定要求帮助分配和释放内存,而不是标准库的通用要求。