Сборщик мусора Boehm - Boehm garbage collector

Бем – Демерс – Вайзер Сборщик мусора
Репозиторий Отредактируйте это в Викиданных
Написано в C и C ++
Тип уборщик мусора
Лицензия аналогично X11 ( бесплатное программное обеспечение )
Интернет сайт www .hboehm .info / gc /

Сборщик мусора Boehm-Demers-Вайзер , часто просто известный как Boehm GC , является консервативным сборщик мусора для C и C ++ , разработанный Гансом Бем, Алан Демерсом и Марк Вайзер .

Boehm GC - это бесплатное программное обеспечение, распространяемое по разрешающей лицензии бесплатного программного обеспечения, аналогичной лицензии X11 .

Дизайн

Ганс Бём описывает работу коллектора следующим образом:

Сборщик использует алгоритм очистки меток. Он обеспечивает инкрементный сбор данных и сбор данных по поколениям в операционных системах, которые обеспечивают правильную поддержку виртуальной памяти. (В настоящее время это включает SunOS [45], IRIX, OSF / 1, Linux и Windows с различными ограничениями.) Это позволяет вызывать код завершения при сборе объекта. Он может использовать информацию о типе для поиска указателей, если такая информация предоставляется, но обычно она используется без такой информации.

Сборщик мусора Boehm также может работать в режиме обнаружения утечек, в котором управление памятью по-прежнему выполняется вручную, но сборщик мусора Boehm может проверить, правильно ли это сделано. Таким образом, программист может найти утечки памяти и двойное освобождение.

Boehm GC также распространяется с библиотекой обработки строк C, называемой cords. Это похоже на веревки в C ++ ( деревья постоянных небольших массивов), но вместо использования подсчета ссылок для правильного освобождения он полагается на сборку мусора для освобождения объектов. Шнуры хорошо справляются с обработкой очень больших текстов, их модификациями в середине, нарезкой, объединением и хранением истории изменений (функции отмены / повтора).

Операция

Сборщик мусора работает с большинством немодифицированных программ C, просто заменив таНос () с GC_MALLOC () вызовы, заменяя перераспределить () с GC_REALLOC () вызовы, и удаление свободных () звонки. В приведенном ниже фрагменте кода показано, как можно использовать Boehm вместо традиционного malloc и free в C.

#include <assert.h>
#include <stdio.h>
#include <gc.h>

int main(void)
{
    int i;
    const int size = 10000000;

    GC_INIT();
    for (i = 0; i < size; ++i)
    {
        int **p = GC_MALLOC(sizeof *p);
        int *q = GC_MALLOC_ATOMIC(sizeof *q);

        assert(*p == 0);
        *p = GC_REALLOC(q, 2 * sizeof *p);
        if (i == size-1)
            printf("Heap size = %zu\n", GC_get_heap_size());
    }

    return 0;
}

Для полноты картины boehm поддерживает явное освобождение через GC_FREE () . Все подстановки можно произвести с помощью макросов препроцессора.

Использование и порты

Сборщик мусора Boehm используется во многих проектах, реализованных на C или C ++, таких как Inkscape , а также в средах выполнения для ряда других языков, включая Crystal , компилятор GNU для среды выполнения Java , проект Portable.NET , Embeddable Common Lisp , GNU Guile , реализация Mono платформы Microsoft .NET (также с использованием точного сжатия GC, начиная с версии 2.8), GNUstep необязательно и libgc-d (привязка к libgc для языка программирования D , используемого в основном в MCI ). Он поддерживает множество операционных систем , включая множество вариантов Unix (например, macOS ) и Microsoft Windows , и предоставляет ряд расширенных функций, включая инкрементный сбор, параллельный сбор и разнообразную семантику финализатора .

Рекомендации

внешняя ссылка