Я запускаю свою программу C на Suse Linux Enterprise, которая сжимает несколько тысяч больших файлов (размером от 10 до 100 МБ), и программа становится все медленнее и медленнее по мере выполнения программы (она работает в многопоточном режиме с 32 потоками на плате Intel Sandy Bridge. ). Когда программа завершается и запускается снова, она все еще очень медленная.
Когда я смотрю, как работает программа, я вижу, что во время работы программы память истощается, что, как вы могли бы подумать, является просто классической проблемой утечки памяти. Но при нормальном несоответствии malloc () / free () я бы ожидал, что вся память вернется, когда программа завершится. Но большая часть памяти не восстанавливается после завершения программы. Команда free или top показывает Mem: 63996M total, 63724M used, 272M free, когда программа замедляется до остановки, но после завершения объем свободной памяти увеличивается только до 3660M. При повторном запуске программы свободная память быстро исчерпывается.
Верхняя программа показывает только то, что во время работы программа использует не более 4% памяти или около того.
Я подумал, что это может быть проблема фрагментации памяти, но я создал небольшую тестовую программу, которая имитирует всю деятельность по распределению памяти в программе (многие рандомизированные аспекты были встроены - размер / количество), и она всегда возвращает всю память при завершение. Так что я не думаю, что это все.
Вопросы:
Может ли быть несоответствие malloc () / free (), которое приведет к потере памяти навсегда, то есть даже после завершения процесса?
Какие еще вещи в программе C (не C ++) могут вызвать необратимую потерю памяти, то есть после завершения программы и даже закрытия окна терминала? Только перезагрузка возвращает память. Я читал другие сообщения о том, что файлы, которые не закрываются, вызывают проблемы, но я не думаю, что у меня есть эта проблема.
Допустимо ли смотреть на верхнюю и свободную статистику памяти, т.е. точно ли они описывают ситуацию с памятью? Кажется, они соответствуют медлительности программы.
Если программа показывает использование памяти только на 4%, найдет ли эта проблема что-нибудь вроде valgrind?