Освобождает ли Boehm GC память?

Я смотрел на Boehm GC (для C/C++), и мне кажется, что (в Windows, но, вероятно, и в Linux) GC по умолчанию никогда не освобождает запрошенную память. Стоит отметить, что я использую более старую версию Boehm GC (7.6).

Кажется, часть, которая занимается распределением памяти, находится в os_dep.c, в Windows похоже, что память выделяется через VirtualAlloc. Я вижу, что сборщик мусора блокирует память в GC_win32_get_mem при создании новых объектов. Чтобы вернуть эту память, потребуется вызов VirtualFree, но, похоже, этого никогда не происходит (есть функция GC_win32_free_heap, но, похоже, она используется только некоторыми тестовыми наборами GC libs).

Есть флаг cmake — USE_MUNMAP. Из документации видно, что при использовании этого флага сборщик мусора иногда возвращает часть выделенной им памяти. Здесь я вижу, что VirtualFree вызывается из части кода, который находится внутри #ifdef в os_dep.c, и, собирая этот флаг, я могу его отладить и увидеть, что теперь он иногда вызывает VirtualFree.

Правильно ли я понимаю, что по умолчанию GC Boehm не освобождает выделенную память? Кто-нибудь знает больше о флаге «USE_MUNMAP» - единственное отличие использования этого флага заключается в том, что сборщик мусора (в определенных случаях, когда некоторые критерии соответствуют) возвращает выделенную память, или есть что-то еще? Также было бы интересно узнать, был ли этот дизайн выбран из соображений производительности. Я могу себе представить, что вызов VirtualFree приведет к некоторым издержкам производительности и, возможно, к фрагментации памяти? Это причина, по которой по умолчанию он вообще не возвращает память, или есть какая-то другая причина?

Если кто-нибудь может пролить свет на это, я был бы очень благодарен.

(Отредактировано 3 июля 2024 г., ранее в этом посте я уже упоминал об ОС, что, вероятно, вызвало некоторую путаницу. Меня интересует только то, выполняет ли Boehm GC соответствующий свободный вызов памяти, которую он ранее выделил, когда ее больше нет. использовать.)

Я не голосую за дубликат, потому что реализация Boehm GC отличается от стандартной C malloc/free, но ответ на этот вопрос обсудим, что память, освобожденная в куче, не возвращается в ОС, это нормально. .

Thomas Jager 02.07.2024 14:28

Большинство распределителей памяти не освобождают память обратно в операционную систему. Если вы выделяете, а затем освобождаете достаточно большие фрагменты памяти, они могут быть полностью освобождены, но чаще всего память сохраняется на случай, если она понадобится вам позже.

Jonathan Leffler 02.07.2024 14:35

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

Barmar 02.07.2024 21:45

Я отредактировал вопрос, сказав, что «возврат памяти в ОС» на самом деле не то, что я имел в виду. Я имел в виду выполнение соответствующего бесплатного вызова внутри программы, когда выделенная область памяти больше не используется сборщиком мусора.

Jim 03.07.2024 10:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
92
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

BDWGC v8.0.0 (и более поздние версии) по умолчанию возвращает неиспользуемую память ОС (на большинстве целевых платформ). Для более старых версий BDWGC вы можете передать флаг --enable-munmap для настройки включения этой функции.

Привет Иван и спасибо за ответ. Я не вижу никакого «--enable-memory-unmapping», но в файле configure.ac есть «--enable-munmap». Я предполагаю, что munmap — это просто сокращение от unmapping памяти. Это тот, о котором вы говорите?

Jim 03.07.2024 13:45

Опечатка в названии опции, исправил

Ivan Maidanski 05.07.2024 13:58

Другие вопросы по теме