stringtranslate.com

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

Сборщик мусора 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 , и предоставляет ряд расширенных функций, включая инкрементальный сбор, параллельный сбор и различные семантики финализатора .

Ссылки

  1. ^ ab Koranne, Sandeep (2011), Справочник по инструментам с открытым исходным кодом, Springer, стр. 151–154, Bibcode :2011hoos.book.....K, ISBN 978-1441977199.
  2. ^ Ганс Бём, Сборщик мусора для C и C++
  3. ^ Эндрю В. Аппель (1998), Современная реализация компилятора на языке C - «Boehm Conservative Garbage Collector»,
  4. ^ HJ Boehm и D. Chase, «Предложение по компиляции языка C, безопасной для сборщика мусора», The Journal of C Language Translation, том 4, номер 2, декабрь 1992 г., страницы 126–141
  5. ^ Использование мусоросборника в качестве детектора утечек
  6. ^ Использование сборщика мусора: простой пример
  7. ^ "Интерфейс сборщика мусора". www.hboehm.info .
  8. ^ Известные применения BDWGC
  9. ^ "Exaloop/Codon". GitHub .
  10. ^ libgc-d

Внешние ссылки