Сборщик мусора Boehm –Demers–Weiser , часто называемый просто Boehm GC или Boehm collector , является консервативным сборщиком мусора для C и C++ [1], разработанным Гансом Бемом, Аланом Демерсом и Марком Вайзером . [2] [3]
Boehm GC — это свободное программное обеспечение , распространяемое по разрешительной лицензии свободного программного обеспечения, аналогичной лицензии X11 . Первая статья, представляющая этот сборщик, появилась в 1992 году. [4]
Ганс Бём описывает работу коллектора следующим образом:
Сборщик использует алгоритм mark-sweep. Он обеспечивает инкрементный и генерационный сбор в операционных системах, которые предоставляют правильный тип поддержки виртуальной памяти. (В настоящее время это включает SunOS[45], IRIX, OSF/1, Linux и Windows, с различными ограничениями.) Он позволяет вызывать код финализации при сборе объекта. Он может использовать информацию о типе для поиска указателей, если такая информация предоставлена, но обычно он используется без такой информации.
— http://www.hboehm.info/gc/#details
Boehm GC также может работать в режиме обнаружения утечек [5] , в котором управление памятью по-прежнему выполняется вручную, но Boehm GC может проверить, выполняется ли это правильно. Таким образом, программист может обнаружить утечки памяти и двойные освобождения.
Boehm GC также распространяется с библиотекой обработки строк C , называемой cords. Это похоже на ropes в C++ ( деревья постоянных небольших массивов), но вместо использования подсчета ссылок для правильного освобождения памяти, он полагается на сборку мусора для освобождения объектов. Cords хороши для обработки очень больших текстов, изменений в них в середине, нарезки, конкатенации и сохранения истории изменений ( функции отмены /повтора).
Сборщик мусора работает с большинством немодифицированных программ на языке C, просто заменяя вызовы malloc() на GC_MALLOC() , заменяя вызовы realloc() на GC_REALLOC() и удаляя вызовы free() . [1] Фрагмент кода ниже показывает, как можно использовать Boehm вместо традиционных malloc и free в языке C. [6]
#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 ( "Размер кучи = %zu \n " , GC_get_heap_size ()); } вернуть 0 ; }
Для полноты картины, Бём поддерживает явное освобождение памяти через GC_FREE() . [7] Все замены можно выполнить с помощью макросов препроцессора.
Boehm GC используется многими проектами [8] , которые реализованы на C или C++, такими как Inkscape , а также средами выполнения для ряда других языков, включая Crystal , высокопроизводительный компилятор Python Codon, [9] среду выполнения GNU Compiler для Java, проект Portable.NET , Embeddable Common Lisp , GNU Guile , реализацию Mono платформы Microsoft .NET (также использующую точный компактный GC с версии 2.8), GNUstep опционально и libgc-d [10] (привязка к libgc для языка программирования D , используемая в основном в MCI). Он поддерживает многочисленные операционные системы , включая множество вариантов Unix (таких как macOS ) и Microsoft Windows , и предоставляет ряд расширенных функций, включая инкрементальный сбор, параллельный сбор и различные семантики финализатора .