Сборщик мусора Boehm - Boehm garbage collector
Репозиторий | |
---|---|
Написано в | C и C ++ |
Тип | уборщик мусора |
Лицензия | аналогично X11 ( бесплатное программное обеспечение ) |
Интернет сайт | www |
Сборщик мусора 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 , и предоставляет ряд расширенных функций, включая инкрементный сбор, параллельный сбор и разнообразную семантику финализатора .