У меня есть долго живущее приложение с частым освобождением выделения памяти. Какая-либо malloc реализация возвратит освобожденную память назад системе?
Что является, в этом отношении, поведением:
Если у меня есть приложение, потребление памяти которого может очень отличаться в дневном времени и ночном времени (например)., я могу вынудить какой-либо malloc's возвратить освобожденную память системе?
Без освобожденной памяти такого возврата будет выгружен и в много раз, но такая память содержит только мусор.
Для всех 'обычных' mallocs, включая те, о которых вы упоминали, память освобождается для повторного использования вашим процессом, а не обратно во всю систему. Освобождение обратно на всю систему происходит только тогда, когда процесс, в конце концов, завершается.
Большинство реализаций не утруждают себя идентификацией тех (относительно редких) случаев, когда целые «блоки» (любого размера, подходящего для ОС) были освобождены и могут быть возвращены, но, конечно, есть исключения. Например, я цитирую страницу википедии в OpenBSD:
При вызове
free
память освобождается и не отображается на адрес процесса { {1}} пробел с использованием munmap. Эта система предназначена для повышения безопасности за счет использования преимущества макета адресного пространства рандомизации и функций страниц с пропусками , реализованных как часть OpenBSDmmap
системный вызов, а также для обнаружения ошибок использования после освобождения - поскольку выделение большой памяти полностью не отображается после ее освобождения, дальнейшее использование вызывает ошибку сегментации и завершение программы.
Однако большинство систем не так ориентированы на безопасность, как OpenBSD.
Зная это, когда я кодирую долго работающую систему, которая имеет заведомо временные требования к большому объему памяти, я всегда пытаюсь разветвлять
процесс: родительский затем просто ожидает результатов от дочернего элемента [[обычно в канале]], дочерний элемент выполняет вычисления (включая выделение памяти), возвращает результаты [[в указанном канале]], а затем завершает работу. Таким образом, мой длительный процесс не будет бесполезно загружать память в течение долгого времени между случайными «всплесками» потребности в памяти. Другие альтернативные стратегии включают переключение на настраиваемый распределитель памяти для таких особых требований (C ++ делает это достаточно простым, хотя языки с виртуальными машинами ниже, такие как Java и Python, как правило, этого не делают).
Из перечисленных вами только Hoard вернет память системе ... но если это действительно возможно, это будет во многом зависеть от распределения памяти вашей программы поведение.
Я имею дело с той же проблемой, что и OP. Пока это кажется возможным с tcmalloc. Я нашел два решения:
скомпилируйте свою программу со связью tcmalloc, затем запустите ее как:
env TCMALLOC_RELEASE = 100 ./my_pthread_soft
, в документации упоминается, что
Разумные ставки находятся в диапазоне [0,10].
но 10 мне кажется недостаточно (т.е. я не вижу изменений).
найдите в коде место, где было бы интересно освободить всю освобожденную память, а затем добавьте этот код:
#include "google / malloc_extension_c.h" // C include
# include " google / malloc_extension.h "// C ++ включает
/ * ... * /
MallocExtension_ReleaseFreeMemory ();
второе решение оказалось очень эффективным в моем случае; первый был бы отличным, но не очень удачным, например, сложно найти правильный номер.