Сборщик мусора Бем-Демерса-Уэйзер , часто просто известный как Boehm GC , является консервативным сборщик мусора для C и C ++ [1] , разработанный Hans Boehm, Алан Демерса и Марк Weiser . [2] [3]
Репозиторий | |
---|---|
Написано в | C и C ++ |
Тип | уборщик мусора |
Лицензия | аналогично X11 ( бесплатное программное обеспечение ) |
Веб-сайт | www |
Boehm GC - это бесплатное программное обеспечение, распространяемое по разрешающей лицензии бесплатного программного обеспечения, аналогичной лицензии X11 .
Дизайн
Ганс Бём описывает работу коллектора следующим образом:
Сборщик использует алгоритм метки-развертки. Он обеспечивает инкрементный сбор данных и сбор данных по поколениям в операционных системах, которые обеспечивают правильную поддержку виртуальной памяти. (В настоящее время это включает SunOS [45], IRIX, OSF / 1, Linux и Windows с различными ограничениями.) Это позволяет вызывать код завершения при сборе объекта. Он может использовать информацию о типе для поиска указателей, если такая информация предоставляется, но обычно она используется без такой информации.
Сборщик мусора Boehm также может работать в режиме обнаружения утечек [4], в котором управление памятью по-прежнему осуществляется вручную, но сборщик мусора Boehm может проверить, правильно ли это сделано. Таким образом, программист может найти утечки памяти и двойное освобождение.
Boehm GC также распространяется с библиотекой обработки строк C, называемой cords. Это похоже на веревки в C ++ ( деревья постоянных небольших массивов), но вместо использования подсчета ссылок для правильного освобождения он полагается на сборку мусора для освобождения объектов. Шнуры хорошо справляются с обработкой очень больших текстов, их модификациями в середине, нарезкой, объединением и хранением истории изменений (функции отмены / повтора).
Операция
Сборщик мусора работает с большинством немодифицированных программ на C, просто заменяя malloc () на GC_MALLOC () вызывает замену realloc () с GC_REALLOC () и удаление бесплатные () звонки. [1] Приведенный ниже фрагмент кода показывает, как можно использовать Boehm вместо традиционного malloc и free в C. [5]
#include #include #include int main ( void ) { int я ; const int size = 10000000 ; GC_INIT (); для ( я = 0 ; я < размер ; ++ я ) { int ** p = GC_MALLOC ( sizeof * p ); INT * д = GC_MALLOC_ATOMIC ( SizeOf * д ); assert ( * p == 0 ); * p = GC_REALLOC ( q ; 2 * размер * p ); if ( i == size -1 ) printf ( "Размер кучи =% zu \ n " , GC_get_heap_size ()); } возврат 0 ; }
Для полноты картины Boehm поддерживает явное освобождение через GC_FREE () . [6] Все подстановки могут быть выполнены с помощью макросов препроцессора.
Использование и порты
Сборщик мусора Boehm используется во многих проектах, реализованных на C или C ++, таких как Inkscape , а также в средах выполнения для ряда других языков, включая Crystal , компилятор GNU для среды выполнения Java , проект Portable.NET , Embeddable Common Lisp , GNU Guile , реализация Mono платформы Microsoft .NET (также с использованием точного уплотнения GC, начиная с версии 2.8), GNUstep необязательно и libgc-d [7] (привязка к libgc для языка программирования D , используемая в основном в MCI ). Он поддерживает множество операционных систем , включая множество вариантов Unix (например, macOS ) и Microsoft Windows , и предоставляет ряд расширенных функций, включая инкрементный сбор, параллельный сбор и разнообразную семантику финализатора .
Рекомендации
- ^ a b Коран, Сандип (2011), Справочник по инструментам с открытым исходным кодом , Springer, стр. 151–154, Bibcode : 2011hoos.book ..... K , ISBN 978-1441977199.
- ^ Hans Boehm, Сборщик мусора для C и C ++
- ^ Эндрю В. Аппель (1998), Современная реализация компилятора на C - " Консервативный сборщик мусора Боэма "
- ^ Использование сборщика мусора в качестве детектора утечек
- ^ Использование сборщика мусора: простой пример
- ^ «Интерфейс сборщика мусора» . www.hboehm.info .
- ^ libgc-d
Внешние ссылки
- Официальный веб-сайт
- Сборщик мусора Boehm на SourceForge.net
- Репозиторий Git для разработки BoehmGC на GitHub
- Прозрачная сборка мусора под руководством программиста для C ++, Hans-J. Бем и Майкл Спертус
- Доктор Доббс Коллекционер Бема для C и C ++, Джин Майкл Стовер, 1 марта 2003 г.