Память небольшого размера mmap, когда munmap, glibc освободит сопоставленную память для ОС? - PullRequest
2 голосов
/ 18 июня 2011

в многопоточной серверной программе я обнаружил увеличение резидентной памяти с 1G до 20G и не уменьшился.Я проверил с инструментами памяти, и у программы нет утечки памяти.так что я думаю, что, возможно, glibc удерживал свободную память, а не выпускал в ОС.Я заменяю alloc на mmap (в общем, каждый mmap будет использовать 65-100 тыс. Кбайт памяти), ожидаю, что когда я вызову munmap, сопоставленная память вернется к ОС, но я вижу, что программа все еще занимает 20G памяти после запуска в течение 1 дня?так что я хочу знать: munmap точно вернет отображенную память в ОС?и другой совет?спасибо.

1 Ответ

2 голосов
/ 18 июня 2011

Да, для небольших выделений (<128k, насколько я помню) glibc обычно будет использовать <code>sbrk и поддерживать свой собственный свободный список. Для больших выделений он будет использовать mmap() и munmap().

munmap обязательно вернет память в систему. Это системный вызов; glibc просто передает его ядру.

Предполагая, что это Linux, вы можете проверить поведение mmap для себя, написав некоторый тестовый код и выполнив cat /proc/PID/maps, где PID - идентификатор процесса вашего процесса. Он напечатает строку для каждой области виртуальной памяти (VMA), которую ядро ​​поддерживает для вашего процесса; по существу, один для каждого mmap ().

Однако, даже если glibc не возвращает память в систему, она перезапустит ее через свой собственный внутренний свободный список. Учитывая это, а также тот факт, что использование mmap () / munmap () ничего не изменило, вам приходило в голову, что, возможно, ваша программа имеет утечку памяти?

...