Я работаю над довольно большой библиотекой, которая постоянно выделяет и освобождает память по мере ее выполнения. В течение последних нескольких недель я старался сохранить стабильное потребление памяти, но со временем оно растет. Поведение, которое я не могу объяснить, заключается в том, что увеличение не является линейным. Существует «базовый» уровень памяти, в течение которого процесс зависает некоторое время, а затем переходит к новой «базовой линии». С течением времени скачок влечет за собой все больше и больше памяти. Предположим, что использование памяти ускорилось с 512 КБ до 1024 КБ после нескольких часов работы. Он может идти от 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;
Чтобы помочь в отладке, выясните, можно ли быстро воспроизвести ошибку, то есть сделать модификацию для запуска через ту же логику выполнения программы (т. Е. Сделать то же распределение/освобождение), но гораздо быстрее –
«прыжки», вероятно, вызваны ваша ОС выделяет память на процессы в кусках. –
Было бы разумным, чтобы размер выделенных блоков увеличивался со временем? –