Реализации malloc возвратят память свободного редактора назад системе?

У меня есть долго живущее приложение с частым освобождением выделения памяти. Какая-либо malloc реализация возвратит освобожденную память назад системе?

Что является, в этом отношении, поведением:

  • ptmalloc 1, 2 (glibc значение по умолчанию) или 3
  • dlmalloc
  • tcmalloc (Google распараллелил malloc),
  • solaris значение по умолчанию 10-11 malloc и mtmalloc
  • Значение по умолчанию FreeBSD 8 malloc (jemalloc)
  • Запас malloc?

Обновление

Если у меня есть приложение, потребление памяти которого может очень отличаться в дневном времени и ночном времени (например)., я могу вынудить какой-либо malloc's возвратить освобожденную память системе?

Без освобожденной памяти такого возврата будет выгружен и в много раз, но такая память содержит только мусор.

54
задан osgx 11 November 2011 в 05:27
поделиться

4 ответа

Для всех 'обычных' mallocs, включая те, о которых вы упоминали, память освобождается для повторного использования вашим процессом, а не обратно во всю систему. Освобождение обратно на всю систему происходит только тогда, когда процесс, в конце концов, завершается.

4
ответ дан 7 November 2019 в 08:07
поделиться

Большинство реализаций не утруждают себя идентификацией тех (относительно редких) случаев, когда целые «блоки» (любого размера, подходящего для ОС) были освобождены и могут быть возвращены, но, конечно, есть исключения. Например, я цитирую страницу википедии в OpenBSD:

При вызове free память освобождается и не отображается на адрес процесса { {1}} пробел с использованием munmap. Эта система предназначена для повышения безопасности за счет использования преимущества макета адресного пространства рандомизации и функций страниц с пропусками , реализованных как часть OpenBSD mmap системный вызов, а также для обнаружения ошибок использования после освобождения - поскольку выделение большой памяти полностью не отображается после ее освобождения, дальнейшее использование вызывает ошибку сегментации и завершение программы.

Однако большинство систем не так ориентированы на безопасность, как OpenBSD.

Зная это, когда я кодирую долго работающую систему, которая имеет заведомо временные требования к большому объему памяти, я всегда пытаюсь разветвлять процесс: родительский затем просто ожидает результатов от дочернего элемента [[обычно в канале]], дочерний элемент выполняет вычисления (включая выделение памяти), возвращает результаты [[в указанном канале]], а затем завершает работу. Таким образом, мой длительный процесс не будет бесполезно загружать память в течение долгого времени между случайными «всплесками» потребности в памяти. Другие альтернативные стратегии включают переключение на настраиваемый распределитель памяти для таких особых требований (C ++ делает это достаточно простым, хотя языки с виртуальными машинами ниже, такие как Java и Python, как правило, этого не делают).

15
ответ дан 7 November 2019 в 08:07
поделиться

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

4
ответ дан 7 November 2019 в 08:07
поделиться

Я имею дело с той же проблемой, что и OP. Пока это кажется возможным с tcmalloc. Я нашел два решения:

  1. скомпилируйте свою программу со связью tcmalloc, затем запустите ее как:

     env TCMALLOC_RELEASE = 100 ./my_pthread_soft
    

    , в документации упоминается, что

    Разумные ставки находятся в диапазоне [0,10].

    но 10 мне кажется недостаточно (т.е. я не вижу изменений).

  2. найдите в коде место, где было бы интересно освободить всю освобожденную память, а затем добавьте этот код:

     #include "google / malloc_extension_c.h" // C include 
     # include " google / malloc_extension.h "// C ++ включает 
     
     / * ... * / 
     
    MallocExtension_ReleaseFreeMemory (); 
     

второе решение оказалось очень эффективным в моем случае; первый был бы отличным, но не очень удачным, например, сложно найти правильный номер.

5
ответ дан 7 November 2019 в 08:07
поделиться