2016-02-15 4 views
1

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

Чтобы помочь в отладке, выясните, можно ли быстро воспроизвести ошибку, то есть сделать модификацию для запуска через ту же логику выполнения программы (т. Е. Сделать то же распределение/освобождение), но гораздо быстрее –

+0

«прыжки», вероятно, вызваны ваша ОС выделяет память на процессы в кусках. –

+0

Было бы разумным, чтобы размер выделенных блоков увеличивался со временем? –

ответ

2

Вы, скорее всего, страдает от фрагментации памяти .

Что происходит, так как вы освобождаете куски памяти, вы получаете небольшие отверстия, которые, возможно, не смогут быть использованы при следующем запросе памяти. По мере того, как вы продолжаете выделять и отпускать в шаблоне, который создает небольшие неиспользуемые отверстия, единственным решением является получение большего количества блоков памяти из системы.

Если у вас есть четко определенные правила использования вашей памяти для определенных вещей, вы можете рассмотреть пул памяти , чтобы помочь выделить и освободить память в соответствии с конкретными требованиями вашей программы, а не общие - использовать требования стандартной библиотеки.

+0

Есть ли какие-либо ссылки на то, как будет выглядеть использование памяти, если бы она действительно была фрагментирована? Я хочу подтвердить, имеет ли смысл увеличение объема дополнительного объема памяти в этом сценарии. –

+0

Не знаю. Вы могли бы сами это выяснить. Или вы можете посмотреть на свой код и убедиться, что у вас нет таких шаблонов: Allocate 1024 байт для A; выделить 50 байтов для B; свободный A; выделить 1024 байта для C; свободный B; .... – paddy

+0

Спасибо за ответы. Код библиотеки довольно большой, и я уверен, что он постоянно создает, добавляет, очищает и удаляет различные массивы и векторы. Я буду держать этот вопрос открытым, пока я исследую. –

Смежные вопросы