Поведение malloc () / free () отличается между Debian и Redhat - PullRequest
1 голос
/ 22 марта 2010

У меня есть приложение для Linux (написанное на C), которое выделяет большой объем памяти (~ 60M) небольшими порциями через malloc (), а затем освобождает его (приложение продолжает работать). Эта память не возвращается в ОС, но остается выделенной для процесса.

Теперь интересно то, что это происходит только в RedHat Linux и клонах (Fedora, Centos и т. Д.), В то время как в системах Debian память возвращается обратно в ОС после того, как все освобождение завершено.

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

Ответы [ 2 ]

4 голосов
/ 27 марта 2010

Я не уверен, почему две системы будут вести себя по-разному (возможно, разные реализации malloc от разных glibc). Однако вы должны иметь возможность контролировать глобальную политику вашего процесса с помощью вызова, подобного:

mallopt(M_TRIM_THRESHOLD, bytes)

(Подробнее см. в этой статье linuxjournal ).

Вы также можете запросить немедленное освобождение с помощью звонка, например

malloc_trim(bytes)

(см. Malloc.h). Я считаю, что оба эти вызова могут потерпеть неудачу, поэтому я не думаю, что вы можете полагаться на то, что они работают 100% времени. Но я думаю, что если вы попробуете их, вы обнаружите, что они имеют значение.

0 голосов
/ 22 марта 2010

Некоторые обработчики mem не предоставляют память как свободную, пока она не понадобится.Вместо этого он оставляет ЦП для выполнения других задач, а затем завершает очистку.Если вы хотите подтвердить, что это действительно так, просто выполните простой тест и выделите и освободите больше памяти в цикле больше раз, чем у вас есть доступная память.

...