Сборка мусора
Сборка мусора (англ. garbage collection) в программировании — одна из форм автоматического управления памятью. Специальный процесс, называемый сборщиком мусора (англ. garbage collector - GC), периодически освобождает память, удаляя из неё ставшие ненужными объекты.
Автоматическая сборка мусора позволяет повысить безопасность доступа к памяти.
История
Сборка мусора была впервые применена Джоном Маккарти в 1959 году в среде программирования на разработанном им функциональном языке программирования Лисп. Впоследствии она применялась в других системах программирования и языках, преимущественно — в функциональных и логических. Необходимость сборки мусора в языках этих типов обусловлена тем, что структура таких языков делает крайне неудобным отслеживание времени жизни объектов в памяти и ручное управление ею. Широко используемые в этих языках списки и основанные на них сложные структуры данных во время работы программ постоянно создаются, надстраиваются, расширяются, копируются, и правильно определить момент удаления того или иного объекта затруднительно.
В промышленных процедурных и объектных языках сборка мусора долго не использовалась. Предпочтение отдавалось ручному управлению памятью, как более эффективному и предсказуемому. Но со второй половины 1980-х годов технология сборки мусора стала использоваться и в директивных (императивных), и в объектных языках программирования, а со второй половины 1990-х годов всё большее число создаваемых языков и сред, ориентированных на прикладное программирование, включают механизм сборки мусора либо как единственный, либо как один из доступных механизмов управления динамической памятью. В настоящее время она используется в Оберон, Java, Python, Ruby, C#, D, F#, Go и других языках.
Ручное управление памятью
Традиционным для директивных языков способом управления памятью является ручной. Его сущность в следующем:
- Новый объект в динамической памяти создаётся специальной командой выделения памяти. Эта команда возвращает указатель на выделенную область памяти, который сохраняется и используется для доступа к ней.
- Пока созданный объект нужен для работы, программа обращается к нему через ранее сохранённый указатель.
- Когда надобность в объекте проходит, программа сама должна его удалить, явно вызвав команду освобождения памяти и передав ей указатель на удаляемый объект.
В любом языке, допускающем создание объектов в динамической памяти, потенциально возможны две проблемы: висячие ссылки и утечки памяти.
Висячие ссылки
Висячая ссылка (англ. dangling pointer) — это ссылка на объект, который уже удалён из памяти. После удаления объекта все сохранившиеся в программе ссылки на него становятся «висячими». Память, занимаемая ранее объектом, может быть передана операционной системе и стать недоступной, или быть использована для размещения нового объекта в той же программе. В первом случае попытка обратиться по «повисшей» ссылке приведёт к срабатыванию механизма защиты памяти и аварийной остановке программы, а во втором — к непредсказуемым последствиям.
Появление висячих ссылок обычно становится следствием неправильной оценки времени жизни объекта: программист вызывает команду удаления объекта до того, как его использование прекратится.
Утечки памяти
Создав объект в динамической памяти, программист может не удалить его после завершения использования. Если ссылающейся на объект переменной будет присвоено новое значение и на объект нет других ссылок, он становится программно недоступным, но продолжает занимать память, поскольку команда его удаления не вызывалась. Такая ситуация и называется утечкой памяти (англ. memory leak).
Если объекты, ссылки на которые теряются, создаются в программе постоянно, то утечка памяти проявляется в постепенном увеличении объёма используемой памяти; если программа работает долго, объём используемой ею памяти постоянно растёт, и через какое-то время ощутимо замедляется работа системы (из-за необходимости при любом выделении памяти использовать свопинг), либо программа исчерпывает доступный объём адресного пространства и завершается с ошибкой.
Механизм сборки мусора
Если бы память компьютера была бесконечной, можно было бы просто оставлять ненужные объекты в памяти. Автоматическое управление памятью со сборкой мусора — эмуляция такого бесконечного компьютера на конечной памяти. Многие ограничения сборщиков мусора (нет гарантии, что финализатор выполнится; управляет только памятью, но не другими ресурсами) вытекают из этой метафоры.
Основные принципы
В системе со сборкой мусора обязанность освобождения памяти возлагается на среду исполнения программы. Программист лишь создаёт динамические объекты и пользуется ими, он может не заботиться об удалении объектов, поскольку это делает за него среда. Для этого в состав среды исполнения включается специальный программный модуль, называемый «сборщиком мусора». Этот модуль периодически запускается, определяет, какие из созданных в динамической памяти объектов больше не используются, и освобождает занимаемую ими память.
Периодичность запуска сборщика мусора определяется особенностями системы. Сборщик может работать в фоновом режиме, запускаясь при неактивности программы (например, когда программа простаивает, ожидая ввода данных пользователем). Сборщик мусора запускается безусловно, останавливая выполнение программы (англ. Stop-the-world), когда очередную операцию выделения памяти оказывается невозможно выполнить из-за того, что вся доступная память исчерпана. После освобождения памяти прерванная операция выделения памяти возобновляется, и программа продолжает исполняться дальше. Если же оказывается, что освободить память невозможно, среда исполнения останавливает программу с сообщением об ошибке «Недостаточно памяти».
Достижимость объекта
Оптимальным было бы удалять из памяти объекты, к которым в процессе дальнейшей работы программы не будет ни одного обращения. Однако выявление таких объектов невозможно, поскольку сводится к алгоритмически неразрешимой задаче об остановке (для этого достаточно предположить, что некоторый объект X будет использован в том и только в том случае, если успешно завершится программа P). Поэтому сборщики мусора используют консервативные оценки, позволяющие гарантировать, что в будущем объект не будет использоваться.
Обычно критерием того, что объект ещё используется, является наличие ссылок на него: если в системе нет больше ссылок на данный объект, то он, очевидно, больше не может быть использован программой, а следовательно, может быть удалён. Этот критерий используется большинством современных сборщиков мусора и называется ещё достижимостью объекта. Он не является теоретически наилучшим, так как в число достижимых, согласно ему, попадают и те объекты, которые уже никогда не будут использованы, но на которые пока ещё существуют ссылки, но гарантирует защиту от появления «висячих» ссылок и может быть реализован достаточно эффективно.
Неформально можно задать следующее рекурсивное определение достижимого объекта:
- определённое множество объектов считается достижимым изначально — корневые объекты, обычно в их число включают все глобальные переменные и объекты, на которые есть ссылки в стеке вызовов;
- любой объект, на который есть ссылка из достижимого объекта, тоже считается достижимым, за исключением ссылок, указанных программистом как слабая.
Алгоритм выставления флагов
Простой алгоритм определения достижимых объектов, «алгоритм пометок» (Mark and Sweep), заключается в следующем:
- для каждого объекта хранится бит, указывающий, достижим ли этот объект из программы или нет;
- изначально все объекты, кроме корневых, помечаются как недостижимые;
- рекурсивно просматриваются и помечаются как достижимые объекты, ещё не помеченные, и до которых можно добраться из корневых объектов по ссылкам;
- те объекты, у которых бит достижимости не был установлен, считаются недостижимыми.
Если два или более объектов ссылаются друг на друга, но ни на один из этих объектов нет ссылок извне, то вся группа считается недостижимой. Данный алгоритм позволяет гарантированно удалять группы объектов, использование которых прекратилось, но в которых имеются ссылки друг на друга. Такие группы часто называются «islands of isolation» (острова изоляции).
Алгоритм подсчёта ссылок
Другой вариант алгоритма определения достижимости — обычный подсчёт ссылок. Его использование замедляет операции присваивания ссылок, но зато определение достижимых объектов тривиально — это все объекты, значение счётчика ссылок которых превышает нуль. Без дополнительных уточнений этот алгоритм, в отличие от предыдущего, не удаляет циклически замкнутые цепочки вышедших из употребления объектов, имеющих ссылки друг на друга.
Стратегии сборки мусора
Как только определено множество недостижимых объектов, сборщик мусора может освободить память, занимаемую ими, и оставить остальное как есть. Также можно после освобождения памяти переместить все или часть оставшихся объектов в другие области памяти, обновив вместе с этим все ссылки на них. Эти два варианта реализации называются, соответственно, неперемещающим и перемещающим.
Обе стратегии имеют как достоинства, так и недостатки.
- Скорость выделения и освобождения памяти
- Неперемещающий сборщик мусора быстрее освобождает память (поскольку эта операция сводится к пометке соответствующих блоков памяти как свободных), но тратит больше времени на её выделение (поскольку память фрагментируется, и при выделении необходимо найти в памяти нужное количество блоков подходящего размера).
- Перемещающий сборщик требует сравнительно больше времени при сборе мусора (тратится дополнительное время на дефрагментацию памяти и изменение всех ссылок на перемещаемые объекты), зато перемещение позволяет использовать чрезвычайно простой и быстрый (O(1)) алгоритм выделения памяти. При дефрагментации объекты передвигаются так, чтобы разделить всю память на две большие области — занятую и свободную, и сохраняется указатель на их границу. Для выделения новой памяти достаточно лишь переместить эту границу, вернув кусок из начала свободной памяти.
- Скорость доступа к объектам в динамической памяти
- Объекты, поля которых используются совместно, перемещающий сборщик позволяет размещать в памяти недалеко друг от друга. Тогда они вероятнее окажутся в кэше процессора одновременно, что уменьшит количество обращений к относительно медленному ОЗУ.
- Совместимость с инородным кодом
- Перемещающий сборщик мусора вызывает затруднения при использовании кода, который не управляется системой автоматического управления памятью (такой код называется (англ. foreign) в традиционной терминологии или неуправляемым (англ. unmanaged) в терминологии Microsoft). Указатель на память, выделенную в системе с неперемещающим сборщиком, можно просто передать инородному коду для использования, удерживая хотя бы одну обычную ссылку на объект, чтобы сборщик его не удалил. Перемещающий сборщик меняет положение объектов в памяти, синхронно меняя все ссылки на них, но поменять ссылки в инородном коде он не может, в результате переданные инородному коду ссылки после перемещения объекта станут некорректными. Для работы с инородным кодом используются различные специальные приёмы, например, pinning — явная блокировка объекта, запрещающая его перемещение во время сборки мусора.
Поколения объектов
Как показывает практика, недавно созданные объекты чаще становятся недостижимыми, чем объекты, существующие длительное время. В соответствии с этой закономерностью многие современные сборщики мусора подразделяют все объекты на несколько поколений — серий объектов с близким временем существования. Как только память, выделенная одному из поколений, заканчивается, в этом поколении и во всех более «молодых» производится поиск недостижимых объектов. Все они удаляются, а оставшиеся переводятся в более «старое» поколение.
Использование поколений сокращает время цикла сборки мусора, поскольку уменьшается число просматриваемых в ходе сборки объектов, однако этот метод требует от среды исполнения отслеживания ссылок между разными поколениями.
Другие механизмы
- Неизменные объекты (англ. immutable objects)
- Правила языка программирования могут устанавливать, что объекты, объявленные специальным образом или относящиеся к определённым типам, являются принципиально неизменяемыми. Например, такими являются символьные строки в Java и ряде других языков. За счёт информации о неизменности система управления памятью может экономить место. Например, когда строковой переменной присваивается значение
"Hello", строка размещается в памяти и переменная получает ссылку на неё. Но если впоследствии такой же строкой будет инициализирована другая переменная, то система найдёт ранее созданную строку"Hello"в памяти и присвоит второй переменной ссылку на неё же, вместо того, чтобы размещать строку в памяти повторно. Поскольку строка является принципиально неизменной, на логику работы программы такое решение никак не повлияет, но строка не будет дублироваться в памяти, сколько бы раз она ни использовалась. И только когда все ссылки на неё будут удалены, строка будет уничтожена сборщиком мусора. - Как правило, такие константные объекты хранятся в специально выделенных областях памяти, называемых «пулами» (область для хранения неизменных строк — «строковый пул»), для эффективной работы с которыми могут применяться довольно специфичные алгоритмы.
- Финализаторы
- Финализатор — это код, который автоматически выполняется непосредственно перед удалением объекта из памяти сборщиком мусора. Финализаторы используются для того, чтобы проверить, выполнена ли очистка объекта, и освободить дополнительную память, если она выделялась при создании или работе объекта в обход системы управления памятью.
- Неквалифицированные программисты нередко пытаются применять финализаторы для освобождения файлов, сетевых сокетов и других системных ресурсов, используемых объектами. Это крайне плохая практика: поскольку момент удаления объекта сборщиком мусора зависит от объёма доступной памяти и интенсивности её использования программой, невозможно предсказать, когда будет вызван финализатор и будет ли он вызван вообще. Для освобождения любых системных ресурсов, кроме оперативной памяти, финализаторы не подходят; программист должен вручную закрыть файлы или сокеты командой наподобие
close(), когда объект реально перестаёт использоваться.
Требования к языку и системе
Чтобы программа могла использовать сборку мусора, необходимо выполнение ряда условий, относящихся к языку, среде исполнения и самой решаемой задаче.
- Необходимость среды исполнения со сборщиком мусора
- Естественно, для сборки мусора необходима динамическая среда, поддерживающая исполнение программы, и наличие в этой среде сборщика мусора. У интерпретируемых языков или языков, компилируемых в байт-код виртуальной машины сборщик мусора может быть включён в код интерпретатора языка или байт-кода, но для компилируемых в объектный код языков сборщик мусора вынужденно становится частью системной библиотеки, которая компонуется (статически или динамически) с программным кодом при создании исполняемого файла, увеличивая размер программы и время её загрузки.
- Поддержка со стороны языка программирования
- Сборщик мусора может нормально функционировать только тогда, когда он может точно отследить все ссылки на все созданные объекты. Очевидно, если язык допускает преобразование ссылок (указателей) в другие типы данных (целые числа, массивы байтов и так далее), такой как Си/Си++, отследить использование таких преобразованных ссылок становится невозможно, и сборка мусора становится бессмысленной — она не защищает от «повисания» ссылок и утечек памяти. Поэтому языки, ориентированные на использование сборки мусора, обычно существенно ограничивают свободу использования указателей, адресной арифметики, преобразований типов указателей к другим типам данных. В части из них вообще нет типа данных «указатель», в части он есть, но не допускает ни преобразований типа, ни изменения.
- Техническая допустимость кратковременных замедлений в работе программ
- Сборка мусора выполняется периодически, как правило, в заранее неизвестные моменты времени. Если приостановка работы программы на время, сравнимое со временем сборки мусора, может привести к критическим ошибкам, использовать в подобной ситуации сборку мусора, очевидно, нельзя.
- Наличие некоторого резерва свободной памяти
- Чем больше памяти доступно среде исполнения, тем реже запускается сборщик мусора и тем эффективнее его работа. Работа сборщика мусора в системе, где количество доступной сборщику памяти приближается к пиковой потребности программы, может оказаться неэффективной и непроизводительной. Чем меньше избыток памяти, тем чаще происходит запуск сборщика и тем больше времени тратится на его выполнение. Падение производительности программы в таком режиме может оказаться слишком существенным.
Проблемы использования
Вопреки часто встречающимся утверждениям, наличие сборки мусора вовсе не освобождает программиста от всех проблем управления памятью.
- Освобождение других ресурсов, занятых объектом
- Помимо динамической памяти, объект может владеть и другими ресурсами — подчас более ценными, чем память. Если объект при создании открывает файл, по завершении использования он должен его закрыть, если подключается к СУБД — должен отключиться. Медлить с освобождением таких ресурсов нельзя: если файл не закроют, он так и останется в недописанном заблокированном состоянии, негодный к дальнейшей обработке, к тому же во многих ОС количество одновременно открытых файлов ограничено. В системах с ручным управлением памятью это делается непосредственно перед удалением объекта из памяти, чаще всего — в деструкторах соответствующих объектов. В системах со сборкой мусора обычно есть возможность выполнить некоторый код непосредственно перед удалением объекта, так называемые финализаторы, но для освобождения ресурсов они не годятся, так как момент удаления заранее неизвестен, и может оказаться, что ресурс освобождается намного позже, чем перестаёт использоваться объект. В подобных случаях программисту всё равно приходится отслеживать использование объекта вручную и вручную выполнять операции по освобождению занятых объектом ресурсов. В C# специально для этой цели существует интерфейс
IDisposable, в Java —AutoCloseable. - Утечка памяти
- В системах со сборкой мусора тоже могут возникать утечки памяти, правда, имеющие несколько другую природу. Ссылка на неиспользуемый объект может сохраниться в другом объекте, который используется и становится своеобразным «якорем», удерживающим ненужный объект в памяти. Например, созданный объект добавляется в коллекцию, используемую для вспомогательных операций, потом перестаёт использоваться, но не удаляется из коллекции. Коллекция удерживает ссылку, объект остаётся достижимым и не подвергается сборке мусора. Результатом становится всё та же утечка памяти.
- Чтобы устранить подобные проблемы, среда исполнения может поддерживать специальное средство — так называемые слабые ссылки. Слабые ссылки не удерживают объект и превращаются в
null, как только объект исчезает — поэтому код должен быть готов к тому, что однажды ссылка укажет в никуда. - Потеря эффективности при операциях с частым выделением и освобождением памяти
- Некоторые действия, вполне безобидные для систем с ручным управлением памятью, в системах со сборкой мусора могут порождать несоразмерно большие накладные расходы. Классический пример подобной проблемы приведён ниже.
String out = ""; // Предполагается, что strings содержит большое количество коротких строк, // из которых нужно собрать одну большую строку в переменной out. for( String str : strings ) { out += str; // Данный код будет каждую итерацию создавать // новую строковую переменную и выделять под неё память. }
- Данный код на языке Java выглядит так, как будто переменная out, созданная однажды, в цикле каждый раз «дописывается» новой строкой. В действительности же строки в Java неизменяемы, поэтому в данном коде на каждом проходе цикла будет происходить:
- Создание новой строковой переменной достаточной длины.
- Копирование в новую переменную старого содержимого out.
- Копирование в новую переменную содержимого str.
- Присваивание переменной out ссылки на новую строковую переменную.
- При этом каждый раз блок памяти, в котором ранее находилось значение переменной out, будет выходить из употребления и ждать до запуска сборщика мусора. Если объединяется подобным образом 100 строк по 100 символов, то суммарно на данную операцию будет выделено более 500000 байт памяти, то есть в 50 раз больше, чем размер конечной «длинной» строки.
- Подобные операции, когда достаточно большие объекты в памяти часто создаются и тут же перестают использоваться, ведут к очень быстрому непродуктивному заполнению всей доступной памяти и частому запуску сборщика мусора, что в определённых условиях может сильно замедлить работу программы или, по крайней мере, потребовать выделения ей для работы неадекватно большого объёма памяти. Во избежание подобных проблем программист должен хорошо представлять себе механизм автоматического управления памятью. Также иногда могут использоваться специальные средства для эффективного выполнения опасных операций. Так, для оптимизации приведённого выше примера необходимо воспользоваться специальным классом StringBuilder, позволяющим одним действием выделить память сразу под всю строку, а в цикле только дописывать в конец этой строки очередной фрагмент.
- Проблемы взаимодействия с инородным кодом и прямой работы с физической памятью
- В практическом программировании почти невозможно обойтись без взаимодействия с так называемым инородным кодом: API операционной системы, драйверы устройств, внешние программные модули, написанные на других языках, не управляются сборщиком мусора. Иногда возникает необходимость работы непосредственно с физической памятью компьютера; система управления памятью это также ограничивает, если вообще допускает.
- Взаимодействие с инородным кодом обеспечивается одним из двух способов: либо на низкоуровневом языке (обычно на Си) пишется обёртка для инородного кода, скрывающая низкоуровневые детали, либо непосредственно в язык добавляется синтаксис, обеспечивающий возможность написания «небезопасного» (unsafe) кода — отдельных фрагментов или модулей, для которых программисту предоставлен более полный контроль за всеми аспектами управления памятью.
- И первое, и второе решение имеет свои недостатки. Обёртки, как правило, сложны, требуют высокой квалификации для разработки, могут быть плохо переносимы. (Впрочем, их создание может быть автоматизировано. Например, существует мультиязыковой генератор SWIG, который по имеющимся заголовочным файлам Си/C++ автоматически создаёт обёртки для целого ряда языков, поддерживающих сборку мусора.) Они подвержены устареванию: обёртка, написанная для одной реализации языка, может стать непригодной для использования в другой, например, при переходе от неперемещающего сборщика мусора к перемещающему.
- Специальный синтаксис для небезопасного кода является «легальной дырой» в механизме управления памятью и источником трудно обнаруживаемых ошибок; при этом самим своим наличием он провоцирует программиста на обход языковых ограничений.
- Кроме того, любое вмешательство в работу сборщика мусора (а оно неизбежно при взаимодействии с инородным кодом) потенциально снижает эффективность его работы. Например, фиксация в памяти определённого региона, которая необходима, чтобы во время работы с этой памятью инородного кода сборщик мусора не удалил и не переместил его, может ограничить возможность дефрагментации памяти и тем самым затруднить последующее выделение фрагментов нужного размера, даже при наличии достаточного общего объёма свободной памяти.
Достоинства и недостатки
По сравнению с ручным управлением памятью сборка мусора безопаснее, поскольку она предотвращает утечки памяти и возникновение висячих ссылок из-за несвоевременного удаления объектов. Она упрощает и сам процесс программирования.
Считается, что сборка мусора заметно сокращает трудозатраты на управление памятью по сравнению с языками, где она не реализована. Согласно исследованию, программисты на Си тратят 30 % — 40 % общего времени разработки (не считая отладки) только на управление памятью. Впрочем, существуют исследования с противоположными выводами, например, в работе утверждается, что реальная разница в скорости разработки программного обеспечения на C++, где нет автоматической сборки мусора, и на Java, где она реализована, невелика.
Наличие сборщика мусора у неопытного разработчика может создать ложное убеждение, что ему вообще не нужно уделять внимание управлению памятью. Хотя сборщик мусора действительно сокращает проблемы неправильного управления памятью, но не устраняет их полностью, а те, что сохраняются, проявляются не в очевидных ошибках, таких как , а в неоправданном расходовании памяти при работе программы. Типичный пример: если программист упустил из виду, что на объект остался хотя бы один необнулённый указатель в глобальной области видимости, такой объект никогда не будет удалён; поиск такой псевдоутечки может быть очень сложным.
Зачастую критически важной является не только гарантия освобождения ресурса, но и гарантия того, что он освободится до вызова какой-то другой процедуры — например, открытые файлы, входы в критические секции. Попытки отдать управление этими ресурсами сборщику мусора (через финализаторы) будут неэффективны или даже некорректны, поэтому приходится управлять ими вручную. В последнее время даже в языках со сборщиком мусора вводят синтаксис, гарантирующий выполнение «кода очистки» (например, специального метода-«деструктора») при выходе переменной, ссылающейся на объект, из зоны видимости.
Во многих случаях системы со сборкой мусора демонстрируют меньшую эффективность, как по скорости, так и по объёму используемой памяти (что неизбежно, так как сборщик мусора сам потребляет ресурсы и нуждается в некотором избытке свободной памяти для нормальной работы). Кроме того, в системах со сборкой мусора сложнее реализуются низкоуровневые алгоритмы, требующие прямого доступа к оперативной памяти компьютера, поскольку свободное использование указателей невозможно, и прямой доступ к памяти требует наличия специальных интерфейсов, написанных на низкоуровневых языках. С другой стороны, в современных системах со сборкой мусора используются очень эффективные алгоритмы управления памятью, дающие минимальные накладные расходы. Нельзя также не учитывать тот факт, что сейчас оперативная память относительно дешева и доступна. В таких условиях ситуации, когда критическими для эффективности программы становятся именно затраты на сборку мусора, крайне редки.
Существенное преимущество сборки мусора проявляется тогда, когда динамически созданные объекты живут длительное время, многократно дублируются, а ссылки на них передаются между различными участками программы. В таких условиях достаточно сложно определить место, где объект перестал использоваться и его можно удалять. Поскольку именно такая ситуация складывается при широком использовании динамически изменяемых структур данных (списки, деревья, графы), сборка мусора является необходимой в широко использующих такие структуры функциональных и логических языках, типа Хаскелла, Лиспа или Пролога. Использование сборки мусора в традиционных императивных языках (основанных на структурной парадигме, возможно, дополненной объектными средствами) определяется желаемым соотношением между простотой и скоростью разработки программ и эффективностью её выполнения.
Альтернативы
Поддержка в некоторых императивных языках автоматического вызова деструктора при выходе объекта из области синтаксической видимости (C++, Ада, Delphi) позволяет разместить код освобождения памяти в деструкторе и быть уверенным, что он будет вызван в любом случае. Это позволяет сконцентрировать опасные места внутри реализации класса, и не требует лишних ресурсов, хотя и предъявляет более высокие требования к квалификации программиста. Одновременно появляется возможность безопасно освобождать в деструкторе и другие занятые объектом ресурсы.
Альтернативой сборке мусора является технология использования «умных ссылок», когда ссылка на динамический объект сама отслеживает число пользователей и автоматически удаляет объект, когда это число становится нулевым. Известной проблемой «умных ссылок» является то, что в условиях, когда программа постоянно создаёт в памяти много небольших короткоживущих объектов (например, при обработке списочных структур), они проигрывают сборке мусора в производительности.
Ещё с 1960-х годов существует управление памятью на основе регионов — технология, в которой память делится на относительно крупные фрагменты, называемые регионами, и уже внутри регионов память выделяется отдельным объектам. При ручном управлении регионы создаются и удаляются самим программистом, при автоматическом — используются различные виды консервативных оценок, позволяющие определить, когда все объекты, выделенные в пределах региона, перестают быть используемыми, после чего система управления памятью удаляет регион целиком. Например, создаётся регион, в котором выделяется память для всех объектов, создаваемых внутри определённой области видимости, не передаваемых вовне, и этот регион уничтожается одной командой, когда исполнение программы выходит из данной области видимости. Переход в управлении памятью (неважно — ручном или автоматическом) от отдельных объектов к более крупным единицам во многих случаях позволяет упростить учёт времени жизни объектов и одновременно снизить накладные расходы. Реализации (разной степени автоматизированности) регионального управления памятью существуют для многих языков программирования, включая ML, Пролог, Си, Cyclone.
Язык программирования Rust предлагает концепцию «владения», основанную на жёстком контроле со стороны компилятора соответствия времени жизни и области видимости объектов. Идея состоит в том, что при создании объекта переменная, которой присваивается ссылка на него, становится «владельцем» этого объекта, и область видимости переменной-владельца ограничивает время жизни объекта. При выходе из области видимости владельца объект автоматически удаляется. Путём присваивания ссылки на объект другой переменной он может быть «заимствован», но заимствование всегда временно и должно быть завершено в пределах времени жизни владельца объекта. «Владение» может быть передано другой переменной (например, объект может быть создан внутри функции и возвращён в её результате), но при этом исходный владелец теряет доступ к объекту. В совокупности правила построены так, чтобы гарантировать невозможность неконтролируемого изменения объекта через посторонние ссылки. Компилятор статически отслеживает время жизни объектов: любая операция, которая хотя бы потенциально может привести к сохранению ссылки на объект после выхода его владельца из области видимости, приводит к ошибке компиляции, что исключает появление «висячих ссылок» и утечек памяти. Такой подход усложняет технику программирования (соответственно, затрудняя обучение языку), но устраняет необходимость как ручного выделения и освобождения памяти, так и использования сборки мусора.
Управление памятью в конкретных языках и системах
Сборка мусора как непременный атрибут среды исполнения программ используется в языках, основанных на декларативной парадигме, таких как LISP, ML, Пролог, Haskell. Её необходимость в этом случае обусловлена самим характером этих языков, не содержащих средств ручного управления временем жизни объектов и не имеющих возможности естественной интеграции подобных средств. Основной сложной структурой данных в таких языках обычно является динамический односвязный список, состоящий из динамически выделяемых списочных ячеек. Списки постоянно создаются, копируются, дублируются, компонуются и разделяются, что делает практически нереальным ручное управление временем жизни каждой выделенной списочной ячейки.
В императивных языках сборка мусора является одним из вариантов, наряду с и некоторыми альтернативными методиками управления памятью. Здесь она рассматривается как средство упрощения программирования и предотвращения ошибок. Одним из первых компилируемых императивных языков со сборкой мусора стал Oberon, продемонстрировавший применимость и достаточно высокую эффективность этого механизма для данного типа языков, но широкую известность и популярность данному подходу принёс язык Java. Впоследствии подход Java был повторён в среде .NET и практически всех работающих в ней языках, начиная с C# и Visual Basic .NET. В то же время появилось множество интерпретируемых языков (JavaScript, Python, Ruby, Lua), куда сборка мусора включалась из соображений доступности языка для не-программистов и упрощения кодирования. Увеличение мощности аппаратуры, происходившее одновременно с совершенствованием самих сборщиков привело к тому, что дополнительные накладные расходы на сборку мусора перестали быть существенными. Большинство современных императивных языков со сборкой мусора вообще не имеют возможностей для явного ручного удаления объектов (например, оператора delete). В системах, использующих интерпретатор или компиляцию в байт-код, сборщик мусора является частью среды исполнения, в тех же языках, которые компилируются в объектный код процессора, он реализуется в виде обязательной системной библиотеки.
Имеется также небольшое количество языков (nim, Modula-3, D), поддерживающих как ручное, так и автоматическое управление памятью, для чего приложение использует две отдельные кучи.
Примечания
- Устоявшийся термин, с точки зрения русского языка правильнее «сбор мусора» (выдержка из словарей ABBYY Lingvo Архивная копия от 25 апреля 2017 на Wayback Machine, словарь Ушакова: сборка Архивная копия от 25 апреля 2017 на Wayback Machine, сбор Архивная копия от 25 апреля 2017 на Wayback Machine, собрать Архивная копия от 25 апреля 2017 на Wayback Machine; Gramota.ru: обсуждение Архивная копия от 25 апреля 2017 на Wayback Machine). По словарю, сборка — это «соединяя отдельные части, детали, сделать, создать что-нибудь, превратить во что-нибудь готовое» и к остальным значениям слова «собрать» применяется именно «сбор».
- . Наверняка вы думаете о сборке мусора неправильно Архивная копия от 19 июля 2013 на Wayback Machine
- Boehm H. Advantages and Disadvantages of Conservative Garbage Collection (англ.). Архивировано 24 июля 2013 года.
(ссылка из Реймонд, Эрик. Искусство программирования для Unix.. — 2005. — С. 357. — 544 с. — ISBN 5-8459-0791-8.) - Lutz Prechelt. An empirical comparison of C, C++, Java, Perl, Python, Rexx, and Tcl (англ.). Технологический институт Карлсруэ. Дата обращения: 26 октября 2013. Архивировано 3 января 2020 года.
- RAII, Dynamic Objects, and Factories in C++, Roland Pibinger, 3 May 2005 (англ.). Дата обращения: 14 февраля 2016. Архивировано 5 марта 2016 года.
В статье не хватает ссылок на источники (см. рекомендации по поиску). |
Википедия, чтение, книга, библиотека, поиск, нажмите, истории, книги, статьи, wikipedia, учить, информация, история, скачать, скачать бесплатно, mp3, видео, mp4, 3gp, jpg, jpeg, gif, png, картинка, музыка, песня, фильм, игра, игры, мобильный, телефон, Android, iOS, apple, мобильный телефон, Samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Сеть, компьютер, Информация о Сборка мусора, Что такое Сборка мусора? Что означает Сборка мусора?
Eta statya o forme avtomaticheskogo upravleniya kompyuternoj pamyatyu O sortirovke i sbore musora sm Othody Sbor Sborka musora angl garbage collection v programmirovanii odna iz form avtomaticheskogo upravleniya pamyatyu Specialnyj process nazyvaemyj sborshikom musora angl garbage collector GC periodicheski osvobozhdaet pamyat udalyaya iz neyo stavshie nenuzhnymi obekty Avtomaticheskaya sborka musora pozvolyaet povysit bezopasnost dostupa k pamyati IstoriyaSborka musora byla vpervye primenena Dzhonom Makkarti v 1959 godu v srede programmirovaniya na razrabotannom im funkcionalnom yazyke programmirovaniya Lisp Vposledstvii ona primenyalas v drugih sistemah programmirovaniya i yazykah preimushestvenno v funkcionalnyh i logicheskih Neobhodimost sborki musora v yazykah etih tipov obuslovlena tem chto struktura takih yazykov delaet krajne neudobnym otslezhivanie vremeni zhizni obektov v pamyati i ruchnoe upravlenie eyu Shiroko ispolzuemye v etih yazykah spiski i osnovannye na nih slozhnye struktury dannyh vo vremya raboty programm postoyanno sozdayutsya nadstraivayutsya rasshiryayutsya kopiruyutsya i pravilno opredelit moment udaleniya togo ili inogo obekta zatrudnitelno V promyshlennyh procedurnyh i obektnyh yazykah sborka musora dolgo ne ispolzovalas Predpochtenie otdavalos ruchnomu upravleniyu pamyatyu kak bolee effektivnomu i predskazuemomu No so vtoroj poloviny 1980 h godov tehnologiya sborki musora stala ispolzovatsya i v direktivnyh imperativnyh i v obektnyh yazykah programmirovaniya a so vtoroj poloviny 1990 h godov vsyo bolshee chislo sozdavaemyh yazykov i sred orientirovannyh na prikladnoe programmirovanie vklyuchayut mehanizm sborki musora libo kak edinstvennyj libo kak odin iz dostupnyh mehanizmov upravleniya dinamicheskoj pamyatyu V nastoyashee vremya ona ispolzuetsya v Oberon Java Python Ruby C D F Go i drugih yazykah Ruchnoe upravlenie pamyatyuTradicionnym dlya direktivnyh yazykov sposobom upravleniya pamyatyu yavlyaetsya ruchnoj Ego sushnost v sleduyushem Novyj obekt v dinamicheskoj pamyati sozdayotsya specialnoj komandoj vydeleniya pamyati Eta komanda vozvrashaet ukazatel na vydelennuyu oblast pamyati kotoryj sohranyaetsya i ispolzuetsya dlya dostupa k nej Poka sozdannyj obekt nuzhen dlya raboty programma obrashaetsya k nemu cherez ranee sohranyonnyj ukazatel Kogda nadobnost v obekte prohodit programma sama dolzhna ego udalit yavno vyzvav komandu osvobozhdeniya pamyati i peredav ej ukazatel na udalyaemyj obekt V lyubom yazyke dopuskayushem sozdanie obektov v dinamicheskoj pamyati potencialno vozmozhny dve problemy visyachie ssylki i utechki pamyati Visyachie ssylki Osnovnaya statya Visyachaya ssylka Visyachaya ssylka angl dangling pointer eto ssylka na obekt kotoryj uzhe udalyon iz pamyati Posle udaleniya obekta vse sohranivshiesya v programme ssylki na nego stanovyatsya visyachimi Pamyat zanimaemaya ranee obektom mozhet byt peredana operacionnoj sisteme i stat nedostupnoj ili byt ispolzovana dlya razmesheniya novogo obekta v toj zhe programme V pervom sluchae popytka obratitsya po povisshej ssylke privedyot k srabatyvaniyu mehanizma zashity pamyati i avarijnoj ostanovke programmy a vo vtorom k nepredskazuemym posledstviyam Poyavlenie visyachih ssylok obychno stanovitsya sledstviem nepravilnoj ocenki vremeni zhizni obekta programmist vyzyvaet komandu udaleniya obekta do togo kak ego ispolzovanie prekratitsya Utechki pamyati Osnovnaya statya Utechka pamyati Sozdav obekt v dinamicheskoj pamyati programmist mozhet ne udalit ego posle zaversheniya ispolzovaniya Esli ssylayushejsya na obekt peremennoj budet prisvoeno novoe znachenie i na obekt net drugih ssylok on stanovitsya programmno nedostupnym no prodolzhaet zanimat pamyat poskolku komanda ego udaleniya ne vyzyvalas Takaya situaciya i nazyvaetsya utechkoj pamyati angl memory leak Esli obekty ssylki na kotorye teryayutsya sozdayutsya v programme postoyanno to utechka pamyati proyavlyaetsya v postepennom uvelichenii obyoma ispolzuemoj pamyati esli programma rabotaet dolgo obyom ispolzuemoj eyu pamyati postoyanno rastyot i cherez kakoe to vremya oshutimo zamedlyaetsya rabota sistemy iz za neobhodimosti pri lyubom vydelenii pamyati ispolzovat svoping libo programma ischerpyvaet dostupnyj obyom adresnogo prostranstva i zavershaetsya s oshibkoj Mehanizm sborki musoraEsli by pamyat kompyutera byla beskonechnoj mozhno bylo by prosto ostavlyat nenuzhnye obekty v pamyati Avtomaticheskoe upravlenie pamyatyu so sborkoj musora emulyaciya takogo beskonechnogo kompyutera na konechnoj pamyati Mnogie ogranicheniya sborshikov musora net garantii chto finalizator vypolnitsya upravlyaet tolko pamyatyu no ne drugimi resursami vytekayut iz etoj metafory Osnovnye principy V sisteme so sborkoj musora obyazannost osvobozhdeniya pamyati vozlagaetsya na sredu ispolneniya programmy Programmist lish sozdayot dinamicheskie obekty i polzuetsya imi on mozhet ne zabotitsya ob udalenii obektov poskolku eto delaet za nego sreda Dlya etogo v sostav sredy ispolneniya vklyuchaetsya specialnyj programmnyj modul nazyvaemyj sborshikom musora Etot modul periodicheski zapuskaetsya opredelyaet kakie iz sozdannyh v dinamicheskoj pamyati obektov bolshe ne ispolzuyutsya i osvobozhdaet zanimaemuyu imi pamyat Periodichnost zapuska sborshika musora opredelyaetsya osobennostyami sistemy Sborshik mozhet rabotat v fonovom rezhime zapuskayas pri neaktivnosti programmy naprimer kogda programma prostaivaet ozhidaya vvoda dannyh polzovatelem Sborshik musora zapuskaetsya bezuslovno ostanavlivaya vypolnenie programmy angl Stop the world kogda ocherednuyu operaciyu vydeleniya pamyati okazyvaetsya nevozmozhno vypolnit iz za togo chto vsya dostupnaya pamyat ischerpana Posle osvobozhdeniya pamyati prervannaya operaciya vydeleniya pamyati vozobnovlyaetsya i programma prodolzhaet ispolnyatsya dalshe Esli zhe okazyvaetsya chto osvobodit pamyat nevozmozhno sreda ispolneniya ostanavlivaet programmu s soobsheniem ob oshibke Nedostatochno pamyati Dostizhimost obekta Optimalnym bylo by udalyat iz pamyati obekty k kotorym v processe dalnejshej raboty programmy ne budet ni odnogo obrasheniya Odnako vyyavlenie takih obektov nevozmozhno poskolku svoditsya k algoritmicheski nerazreshimoj zadache ob ostanovke dlya etogo dostatochno predpolozhit chto nekotoryj obekt X budet ispolzovan v tom i tolko v tom sluchae esli uspeshno zavershitsya programma P Poetomu sborshiki musora ispolzuyut konservativnye ocenki pozvolyayushie garantirovat chto v budushem obekt ne budet ispolzovatsya Obychno kriteriem togo chto obekt eshyo ispolzuetsya yavlyaetsya nalichie ssylok na nego esli v sisteme net bolshe ssylok na dannyj obekt to on ochevidno bolshe ne mozhet byt ispolzovan programmoj a sledovatelno mozhet byt udalyon Etot kriterij ispolzuetsya bolshinstvom sovremennyh sborshikov musora i nazyvaetsya eshyo dostizhimostyu obekta On ne yavlyaetsya teoreticheski nailuchshim tak kak v chislo dostizhimyh soglasno emu popadayut i te obekty kotorye uzhe nikogda ne budut ispolzovany no na kotorye poka eshyo sushestvuyut ssylki no garantiruet zashitu ot poyavleniya visyachih ssylok i mozhet byt realizovan dostatochno effektivno Neformalno mozhno zadat sleduyushee rekursivnoe opredelenie dostizhimogo obekta opredelyonnoe mnozhestvo obektov schitaetsya dostizhimym iznachalno kornevye obekty obychno v ih chislo vklyuchayut vse globalnye peremennye i obekty na kotorye est ssylki v steke vyzovov lyuboj obekt na kotoryj est ssylka iz dostizhimogo obekta tozhe schitaetsya dostizhimym za isklyucheniem ssylok ukazannyh programmistom kak slabaya Algoritm vystavleniya flagov Prostoj algoritm opredeleniya dostizhimyh obektov algoritm pometok Mark and Sweep zaklyuchaetsya v sleduyushem dlya kazhdogo obekta hranitsya bit ukazyvayushij dostizhim li etot obekt iz programmy ili net iznachalno vse obekty krome kornevyh pomechayutsya kak nedostizhimye rekursivno prosmatrivayutsya i pomechayutsya kak dostizhimye obekty eshyo ne pomechennye i do kotoryh mozhno dobratsya iz kornevyh obektov po ssylkam te obekty u kotoryh bit dostizhimosti ne byl ustanovlen schitayutsya nedostizhimymi Esli dva ili bolee obektov ssylayutsya drug na druga no ni na odin iz etih obektov net ssylok izvne to vsya gruppa schitaetsya nedostizhimoj Dannyj algoritm pozvolyaet garantirovanno udalyat gruppy obektov ispolzovanie kotoryh prekratilos no v kotoryh imeyutsya ssylki drug na druga Takie gruppy chasto nazyvayutsya islands of isolation ostrova izolyacii Algoritm podschyota ssylok Drugoj variant algoritma opredeleniya dostizhimosti obychnyj podschyot ssylok Ego ispolzovanie zamedlyaet operacii prisvaivaniya ssylok no zato opredelenie dostizhimyh obektov trivialno eto vse obekty znachenie schyotchika ssylok kotoryh prevyshaet nul Bez dopolnitelnyh utochnenij etot algoritm v otlichie ot predydushego ne udalyaet ciklicheski zamknutye cepochki vyshedshih iz upotrebleniya obektov imeyushih ssylki drug na druga Strategii sborki musora Kak tolko opredeleno mnozhestvo nedostizhimyh obektov sborshik musora mozhet osvobodit pamyat zanimaemuyu imi i ostavit ostalnoe kak est Takzhe mozhno posle osvobozhdeniya pamyati peremestit vse ili chast ostavshihsya obektov v drugie oblasti pamyati obnoviv vmeste s etim vse ssylki na nih Eti dva varianta realizacii nazyvayutsya sootvetstvenno neperemeshayushim i peremeshayushim Obe strategii imeyut kak dostoinstva tak i nedostatki Skorost vydeleniya i osvobozhdeniya pamyati Neperemeshayushij sborshik musora bystree osvobozhdaet pamyat poskolku eta operaciya svoditsya k pometke sootvetstvuyushih blokov pamyati kak svobodnyh no tratit bolshe vremeni na eyo vydelenie poskolku pamyat fragmentiruetsya i pri vydelenii neobhodimo najti v pamyati nuzhnoe kolichestvo blokov podhodyashego razmera Peremeshayushij sborshik trebuet sravnitelno bolshe vremeni pri sbore musora tratitsya dopolnitelnoe vremya na defragmentaciyu pamyati i izmenenie vseh ssylok na peremeshaemye obekty zato peremeshenie pozvolyaet ispolzovat chrezvychajno prostoj i bystryj O 1 algoritm vydeleniya pamyati Pri defragmentacii obekty peredvigayutsya tak chtoby razdelit vsyu pamyat na dve bolshie oblasti zanyatuyu i svobodnuyu i sohranyaetsya ukazatel na ih granicu Dlya vydeleniya novoj pamyati dostatochno lish peremestit etu granicu vernuv kusok iz nachala svobodnoj pamyati Skorost dostupa k obektam v dinamicheskoj pamyati Obekty polya kotoryh ispolzuyutsya sovmestno peremeshayushij sborshik pozvolyaet razmeshat v pamyati nedaleko drug ot druga Togda oni veroyatnee okazhutsya v keshe processora odnovremenno chto umenshit kolichestvo obrashenij k otnositelno medlennomu OZU Sovmestimost s inorodnym kodom Peremeshayushij sborshik musora vyzyvaet zatrudneniya pri ispolzovanii koda kotoryj ne upravlyaetsya sistemoj avtomaticheskogo upravleniya pamyatyu takoj kod nazyvaetsya angl foreign v tradicionnoj terminologii ili neupravlyaemym angl unmanaged v terminologii Microsoft Ukazatel na pamyat vydelennuyu v sisteme s neperemeshayushim sborshikom mozhno prosto peredat inorodnomu kodu dlya ispolzovaniya uderzhivaya hotya by odnu obychnuyu ssylku na obekt chtoby sborshik ego ne udalil Peremeshayushij sborshik menyaet polozhenie obektov v pamyati sinhronno menyaya vse ssylki na nih no pomenyat ssylki v inorodnom kode on ne mozhet v rezultate peredannye inorodnomu kodu ssylki posle peremesheniya obekta stanut nekorrektnymi Dlya raboty s inorodnym kodom ispolzuyutsya razlichnye specialnye priyomy naprimer pinning yavnaya blokirovka obekta zapreshayushaya ego peremeshenie vo vremya sborki musora Pokoleniya obektov Kak pokazyvaet praktika nedavno sozdannye obekty chashe stanovyatsya nedostizhimymi chem obekty sushestvuyushie dlitelnoe vremya V sootvetstvii s etoj zakonomernostyu mnogie sovremennye sborshiki musora podrazdelyayut vse obekty na neskolko pokolenij serij obektov s blizkim vremenem sushestvovaniya Kak tolko pamyat vydelennaya odnomu iz pokolenij zakanchivaetsya v etom pokolenii i vo vseh bolee molodyh proizvoditsya poisk nedostizhimyh obektov Vse oni udalyayutsya a ostavshiesya perevodyatsya v bolee staroe pokolenie Ispolzovanie pokolenij sokrashaet vremya cikla sborki musora poskolku umenshaetsya chislo prosmatrivaemyh v hode sborki obektov odnako etot metod trebuet ot sredy ispolneniya otslezhivaniya ssylok mezhdu raznymi pokoleniyami Drugie mehanizmy Neizmennye obekty angl immutable objects Sm takzhe Neizmenyaemyj obekt Pravila yazyka programmirovaniya mogut ustanavlivat chto obekty obyavlennye specialnym obrazom ili otnosyashiesya k opredelyonnym tipam yavlyayutsya principialno neizmenyaemymi Naprimer takimi yavlyayutsya simvolnye stroki v Java i ryade drugih yazykov Za schyot informacii o neizmennosti sistema upravleniya pamyatyu mozhet ekonomit mesto Naprimer kogda strokovoj peremennoj prisvaivaetsya znachenie Hello stroka razmeshaetsya v pamyati i peremennaya poluchaet ssylku na neyo No esli vposledstvii takoj zhe strokoj budet inicializirovana drugaya peremennaya to sistema najdyot ranee sozdannuyu stroku Hello v pamyati i prisvoit vtoroj peremennoj ssylku na neyo zhe vmesto togo chtoby razmeshat stroku v pamyati povtorno Poskolku stroka yavlyaetsya principialno neizmennoj na logiku raboty programmy takoe reshenie nikak ne povliyaet no stroka ne budet dublirovatsya v pamyati skolko by raz ona ni ispolzovalas I tolko kogda vse ssylki na neyo budut udaleny stroka budet unichtozhena sborshikom musora Kak pravilo takie konstantnye obekty hranyatsya v specialno vydelennyh oblastyah pamyati nazyvaemyh pulami oblast dlya hraneniya neizmennyh strok strokovyj pul dlya effektivnoj raboty s kotorymi mogut primenyatsya dovolno specifichnye algoritmy Finalizatory Sm takzhe Finalizator Finalizator eto kod kotoryj avtomaticheski vypolnyaetsya neposredstvenno pered udaleniem obekta iz pamyati sborshikom musora Finalizatory ispolzuyutsya dlya togo chtoby proverit vypolnena li ochistka obekta i osvobodit dopolnitelnuyu pamyat esli ona vydelyalas pri sozdanii ili rabote obekta v obhod sistemy upravleniya pamyatyu Nekvalificirovannye programmisty neredko pytayutsya primenyat finalizatory dlya osvobozhdeniya fajlov setevyh soketov i drugih sistemnyh resursov ispolzuemyh obektami Eto krajne plohaya praktika poskolku moment udaleniya obekta sborshikom musora zavisit ot obyoma dostupnoj pamyati i intensivnosti eyo ispolzovaniya programmoj nevozmozhno predskazat kogda budet vyzvan finalizator i budet li on vyzvan voobshe Dlya osvobozhdeniya lyubyh sistemnyh resursov krome operativnoj pamyati finalizatory ne podhodyat programmist dolzhen vruchnuyu zakryt fajly ili sokety komandoj napodobie close kogda obekt realno perestayot ispolzovatsya Trebovaniya k yazyku i sistemeChtoby programma mogla ispolzovat sborku musora neobhodimo vypolnenie ryada uslovij otnosyashihsya k yazyku srede ispolneniya i samoj reshaemoj zadache Neobhodimost sredy ispolneniya so sborshikom musora Estestvenno dlya sborki musora neobhodima dinamicheskaya sreda podderzhivayushaya ispolnenie programmy i nalichie v etoj srede sborshika musora U interpretiruemyh yazykov ili yazykov kompiliruemyh v bajt kod virtualnoj mashiny sborshik musora mozhet byt vklyuchyon v kod interpretatora yazyka ili bajt koda no dlya kompiliruemyh v obektnyj kod yazykov sborshik musora vynuzhdenno stanovitsya chastyu sistemnoj biblioteki kotoraya komponuetsya staticheski ili dinamicheski s programmnym kodom pri sozdanii ispolnyaemogo fajla uvelichivaya razmer programmy i vremya eyo zagruzki Podderzhka so storony yazyka programmirovaniya Sborshik musora mozhet normalno funkcionirovat tolko togda kogda on mozhet tochno otsledit vse ssylki na vse sozdannye obekty Ochevidno esli yazyk dopuskaet preobrazovanie ssylok ukazatelej v drugie tipy dannyh celye chisla massivy bajtov i tak dalee takoj kak Si Si otsledit ispolzovanie takih preobrazovannyh ssylok stanovitsya nevozmozhno i sborka musora stanovitsya bessmyslennoj ona ne zashishaet ot povisaniya ssylok i utechek pamyati Poetomu yazyki orientirovannye na ispolzovanie sborki musora obychno sushestvenno ogranichivayut svobodu ispolzovaniya ukazatelej adresnoj arifmetiki preobrazovanij tipov ukazatelej k drugim tipam dannyh V chasti iz nih voobshe net tipa dannyh ukazatel v chasti on est no ne dopuskaet ni preobrazovanij tipa ni izmeneniya Tehnicheskaya dopustimost kratkovremennyh zamedlenij v rabote programm Sborka musora vypolnyaetsya periodicheski kak pravilo v zaranee neizvestnye momenty vremeni Esli priostanovka raboty programmy na vremya sravnimoe so vremenem sborki musora mozhet privesti k kriticheskim oshibkam ispolzovat v podobnoj situacii sborku musora ochevidno nelzya Nalichie nekotorogo rezerva svobodnoj pamyati Chem bolshe pamyati dostupno srede ispolneniya tem rezhe zapuskaetsya sborshik musora i tem effektivnee ego rabota Rabota sborshika musora v sisteme gde kolichestvo dostupnoj sborshiku pamyati priblizhaetsya k pikovoj potrebnosti programmy mozhet okazatsya neeffektivnoj i neproizvoditelnoj Chem menshe izbytok pamyati tem chashe proishodit zapusk sborshika i tem bolshe vremeni tratitsya na ego vypolnenie Padenie proizvoditelnosti programmy v takom rezhime mozhet okazatsya slishkom sushestvennym Problemy ispolzovaniyaVopreki chasto vstrechayushimsya utverzhdeniyam nalichie sborki musora vovse ne osvobozhdaet programmista ot vseh problem upravleniya pamyatyu Osvobozhdenie drugih resursov zanyatyh obektom Pomimo dinamicheskoj pamyati obekt mozhet vladet i drugimi resursami podchas bolee cennymi chem pamyat Esli obekt pri sozdanii otkryvaet fajl po zavershenii ispolzovaniya on dolzhen ego zakryt esli podklyuchaetsya k SUBD dolzhen otklyuchitsya Medlit s osvobozhdeniem takih resursov nelzya esli fajl ne zakroyut on tak i ostanetsya v nedopisannom zablokirovannom sostoyanii negodnyj k dalnejshej obrabotke k tomu zhe vo mnogih OS kolichestvo odnovremenno otkrytyh fajlov ogranicheno V sistemah s ruchnym upravleniem pamyatyu eto delaetsya neposredstvenno pered udaleniem obekta iz pamyati chashe vsego v destruktorah sootvetstvuyushih obektov V sistemah so sborkoj musora obychno est vozmozhnost vypolnit nekotoryj kod neposredstvenno pered udaleniem obekta tak nazyvaemye finalizatory no dlya osvobozhdeniya resursov oni ne godyatsya tak kak moment udaleniya zaranee neizvesten i mozhet okazatsya chto resurs osvobozhdaetsya namnogo pozzhe chem perestayot ispolzovatsya obekt V podobnyh sluchayah programmistu vsyo ravno prihoditsya otslezhivat ispolzovanie obekta vruchnuyu i vruchnuyu vypolnyat operacii po osvobozhdeniyu zanyatyh obektom resursov V C specialno dlya etoj celi sushestvuet interfejs IDisposable v Java AutoCloseable Utechka pamyati V sistemah so sborkoj musora tozhe mogut voznikat utechki pamyati pravda imeyushie neskolko druguyu prirodu Ssylka na neispolzuemyj obekt mozhet sohranitsya v drugom obekte kotoryj ispolzuetsya i stanovitsya svoeobraznym yakorem uderzhivayushim nenuzhnyj obekt v pamyati Naprimer sozdannyj obekt dobavlyaetsya v kollekciyu ispolzuemuyu dlya vspomogatelnyh operacij potom perestayot ispolzovatsya no ne udalyaetsya iz kollekcii Kollekciya uderzhivaet ssylku obekt ostayotsya dostizhimym i ne podvergaetsya sborke musora Rezultatom stanovitsya vsyo ta zhe utechka pamyati Chtoby ustranit podobnye problemy sreda ispolneniya mozhet podderzhivat specialnoe sredstvo tak nazyvaemye slabye ssylki Slabye ssylki ne uderzhivayut obekt i prevrashayutsya v null kak tolko obekt ischezaet poetomu kod dolzhen byt gotov k tomu chto odnazhdy ssylka ukazhet v nikuda Poterya effektivnosti pri operaciyah s chastym vydeleniem i osvobozhdeniem pamyati Nekotorye dejstviya vpolne bezobidnye dlya sistem s ruchnym upravleniem pamyatyu v sistemah so sborkoj musora mogut porozhdat nesorazmerno bolshie nakladnye rashody Klassicheskij primer podobnoj problemy privedyon nizhe String out Predpolagaetsya chto strings soderzhit bolshoe kolichestvo korotkih strok iz kotoryh nuzhno sobrat odnu bolshuyu stroku v peremennoj out for String str strings out str Dannyj kod budet kazhduyu iteraciyu sozdavat novuyu strokovuyu peremennuyu i vydelyat pod neyo pamyat Dannyj kod na yazyke Java vyglyadit tak kak budto peremennaya out sozdannaya odnazhdy v cikle kazhdyj raz dopisyvaetsya novoj strokoj V dejstvitelnosti zhe stroki v Java neizmenyaemy poetomu v dannom kode na kazhdom prohode cikla budet proishodit Sozdanie novoj strokovoj peremennoj dostatochnoj dliny Kopirovanie v novuyu peremennuyu starogo soderzhimogo out Kopirovanie v novuyu peremennuyu soderzhimogo str Prisvaivanie peremennoj out ssylki na novuyu strokovuyu peremennuyu Pri etom kazhdyj raz blok pamyati v kotorom ranee nahodilos znachenie peremennoj out budet vyhodit iz upotrebleniya i zhdat do zapuska sborshika musora Esli obedinyaetsya podobnym obrazom 100 strok po 100 simvolov to summarno na dannuyu operaciyu budet vydeleno bolee 500000 bajt pamyati to est v 50 raz bolshe chem razmer konechnoj dlinnoj stroki Podobnye operacii kogda dostatochno bolshie obekty v pamyati chasto sozdayutsya i tut zhe perestayut ispolzovatsya vedut k ochen bystromu neproduktivnomu zapolneniyu vsej dostupnoj pamyati i chastomu zapusku sborshika musora chto v opredelyonnyh usloviyah mozhet silno zamedlit rabotu programmy ili po krajnej mere potrebovat vydeleniya ej dlya raboty neadekvatno bolshogo obyoma pamyati Vo izbezhanie podobnyh problem programmist dolzhen horosho predstavlyat sebe mehanizm avtomaticheskogo upravleniya pamyatyu Takzhe inogda mogut ispolzovatsya specialnye sredstva dlya effektivnogo vypolneniya opasnyh operacij Tak dlya optimizacii privedyonnogo vyshe primera neobhodimo vospolzovatsya specialnym klassom StringBuilder pozvolyayushim odnim dejstviem vydelit pamyat srazu pod vsyu stroku a v cikle tolko dopisyvat v konec etoj stroki ocherednoj fragment Problemy vzaimodejstviya s inorodnym kodom i pryamoj raboty s fizicheskoj pamyatyu V prakticheskom programmirovanii pochti nevozmozhno obojtis bez vzaimodejstviya s tak nazyvaemym inorodnym kodom API operacionnoj sistemy drajvery ustrojstv vneshnie programmnye moduli napisannye na drugih yazykah ne upravlyayutsya sborshikom musora Inogda voznikaet neobhodimost raboty neposredstvenno s fizicheskoj pamyatyu kompyutera sistema upravleniya pamyatyu eto takzhe ogranichivaet esli voobshe dopuskaet Vzaimodejstvie s inorodnym kodom obespechivaetsya odnim iz dvuh sposobov libo na nizkourovnevom yazyke obychno na Si pishetsya obyortka dlya inorodnogo koda skryvayushaya nizkourovnevye detali libo neposredstvenno v yazyk dobavlyaetsya sintaksis obespechivayushij vozmozhnost napisaniya nebezopasnogo unsafe koda otdelnyh fragmentov ili modulej dlya kotoryh programmistu predostavlen bolee polnyj kontrol za vsemi aspektami upravleniya pamyatyu I pervoe i vtoroe reshenie imeet svoi nedostatki Obyortki kak pravilo slozhny trebuyut vysokoj kvalifikacii dlya razrabotki mogut byt ploho perenosimy Vprochem ih sozdanie mozhet byt avtomatizirovano Naprimer sushestvuet multiyazykovoj generator SWIG kotoryj po imeyushimsya zagolovochnym fajlam Si C avtomaticheski sozdayot obyortki dlya celogo ryada yazykov podderzhivayushih sborku musora Oni podverzheny ustarevaniyu obyortka napisannaya dlya odnoj realizacii yazyka mozhet stat neprigodnoj dlya ispolzovaniya v drugoj naprimer pri perehode ot neperemeshayushego sborshika musora k peremeshayushemu Specialnyj sintaksis dlya nebezopasnogo koda yavlyaetsya legalnoj dyroj v mehanizme upravleniya pamyatyu i istochnikom trudno obnaruzhivaemyh oshibok pri etom samim svoim nalichiem on provociruet programmista na obhod yazykovyh ogranichenij Krome togo lyuboe vmeshatelstvo v rabotu sborshika musora a ono neizbezhno pri vzaimodejstvii s inorodnym kodom potencialno snizhaet effektivnost ego raboty Naprimer fiksaciya v pamyati opredelyonnogo regiona kotoraya neobhodima chtoby vo vremya raboty s etoj pamyatyu inorodnogo koda sborshik musora ne udalil i ne peremestil ego mozhet ogranichit vozmozhnost defragmentacii pamyati i tem samym zatrudnit posleduyushee vydelenie fragmentov nuzhnogo razmera dazhe pri nalichii dostatochnogo obshego obyoma svobodnoj pamyati Dostoinstva i nedostatkiPo sravneniyu s ruchnym upravleniem pamyatyu sborka musora bezopasnee poskolku ona predotvrashaet utechki pamyati i vozniknovenie visyachih ssylok iz za nesvoevremennogo udaleniya obektov Ona uproshaet i sam process programmirovaniya Schitaetsya chto sborka musora zametno sokrashaet trudozatraty na upravlenie pamyatyu po sravneniyu s yazykami gde ona ne realizovana Soglasno issledovaniyu programmisty na Si tratyat 30 40 obshego vremeni razrabotki ne schitaya otladki tolko na upravlenie pamyatyu Vprochem sushestvuyut issledovaniya s protivopolozhnymi vyvodami naprimer v rabote utverzhdaetsya chto realnaya raznica v skorosti razrabotki programmnogo obespecheniya na C gde net avtomaticheskoj sborki musora i na Java gde ona realizovana nevelika Nalichie sborshika musora u neopytnogo razrabotchika mozhet sozdat lozhnoe ubezhdenie chto emu voobshe ne nuzhno udelyat vnimanie upravleniyu pamyatyu Hotya sborshik musora dejstvitelno sokrashaet problemy nepravilnogo upravleniya pamyatyu no ne ustranyaet ih polnostyu a te chto sohranyayutsya proyavlyayutsya ne v ochevidnyh oshibkah takih kak a v neopravdannom rashodovanii pamyati pri rabote programmy Tipichnyj primer esli programmist upustil iz vidu chto na obekt ostalsya hotya by odin neobnulyonnyj ukazatel v globalnoj oblasti vidimosti takoj obekt nikogda ne budet udalyon poisk takoj psevdoutechki mozhet byt ochen slozhnym Zachastuyu kriticheski vazhnoj yavlyaetsya ne tolko garantiya osvobozhdeniya resursa no i garantiya togo chto on osvoboditsya do vyzova kakoj to drugoj procedury naprimer otkrytye fajly vhody v kriticheskie sekcii Popytki otdat upravlenie etimi resursami sborshiku musora cherez finalizatory budut neeffektivny ili dazhe nekorrektny poetomu prihoditsya upravlyat imi vruchnuyu V poslednee vremya dazhe v yazykah so sborshikom musora vvodyat sintaksis garantiruyushij vypolnenie koda ochistki naprimer specialnogo metoda destruktora pri vyhode peremennoj ssylayushejsya na obekt iz zony vidimosti Vo mnogih sluchayah sistemy so sborkoj musora demonstriruyut menshuyu effektivnost kak po skorosti tak i po obyomu ispolzuemoj pamyati chto neizbezhno tak kak sborshik musora sam potreblyaet resursy i nuzhdaetsya v nekotorom izbytke svobodnoj pamyati dlya normalnoj raboty Krome togo v sistemah so sborkoj musora slozhnee realizuyutsya nizkourovnevye algoritmy trebuyushie pryamogo dostupa k operativnoj pamyati kompyutera poskolku svobodnoe ispolzovanie ukazatelej nevozmozhno i pryamoj dostup k pamyati trebuet nalichiya specialnyh interfejsov napisannyh na nizkourovnevyh yazykah S drugoj storony v sovremennyh sistemah so sborkoj musora ispolzuyutsya ochen effektivnye algoritmy upravleniya pamyatyu dayushie minimalnye nakladnye rashody Nelzya takzhe ne uchityvat tot fakt chto sejchas operativnaya pamyat otnositelno desheva i dostupna V takih usloviyah situacii kogda kriticheskimi dlya effektivnosti programmy stanovyatsya imenno zatraty na sborku musora krajne redki Sushestvennoe preimushestvo sborki musora proyavlyaetsya togda kogda dinamicheski sozdannye obekty zhivut dlitelnoe vremya mnogokratno dubliruyutsya a ssylki na nih peredayutsya mezhdu razlichnymi uchastkami programmy V takih usloviyah dostatochno slozhno opredelit mesto gde obekt perestal ispolzovatsya i ego mozhno udalyat Poskolku imenno takaya situaciya skladyvaetsya pri shirokom ispolzovanii dinamicheski izmenyaemyh struktur dannyh spiski derevya grafy sborka musora yavlyaetsya neobhodimoj v shiroko ispolzuyushih takie struktury funkcionalnyh i logicheskih yazykah tipa Haskella Lispa ili Prologa Ispolzovanie sborki musora v tradicionnyh imperativnyh yazykah osnovannyh na strukturnoj paradigme vozmozhno dopolnennoj obektnymi sredstvami opredelyaetsya zhelaemym sootnosheniem mezhdu prostotoj i skorostyu razrabotki programm i effektivnostyu eyo vypolneniya AlternativyPodderzhka v nekotoryh imperativnyh yazykah avtomaticheskogo vyzova destruktora pri vyhode obekta iz oblasti sintaksicheskoj vidimosti C Ada Delphi pozvolyaet razmestit kod osvobozhdeniya pamyati v destruktore i byt uverennym chto on budet vyzvan v lyubom sluchae Eto pozvolyaet skoncentrirovat opasnye mesta vnutri realizacii klassa i ne trebuet lishnih resursov hotya i predyavlyaet bolee vysokie trebovaniya k kvalifikacii programmista Odnovremenno poyavlyaetsya vozmozhnost bezopasno osvobozhdat v destruktore i drugie zanyatye obektom resursy Alternativoj sborke musora yavlyaetsya tehnologiya ispolzovaniya umnyh ssylok kogda ssylka na dinamicheskij obekt sama otslezhivaet chislo polzovatelej i avtomaticheski udalyaet obekt kogda eto chislo stanovitsya nulevym Izvestnoj problemoj umnyh ssylok yavlyaetsya to chto v usloviyah kogda programma postoyanno sozdayot v pamyati mnogo nebolshih korotkozhivushih obektov naprimer pri obrabotke spisochnyh struktur oni proigryvayut sborke musora v proizvoditelnosti Eshyo s 1960 h godov sushestvuet upravlenie pamyatyu na osnove regionov tehnologiya v kotoroj pamyat delitsya na otnositelno krupnye fragmenty nazyvaemye regionami i uzhe vnutri regionov pamyat vydelyaetsya otdelnym obektam Pri ruchnom upravlenii regiony sozdayutsya i udalyayutsya samim programmistom pri avtomaticheskom ispolzuyutsya razlichnye vidy konservativnyh ocenok pozvolyayushie opredelit kogda vse obekty vydelennye v predelah regiona perestayut byt ispolzuemymi posle chego sistema upravleniya pamyatyu udalyaet region celikom Naprimer sozdayotsya region v kotorom vydelyaetsya pamyat dlya vseh obektov sozdavaemyh vnutri opredelyonnoj oblasti vidimosti ne peredavaemyh vovne i etot region unichtozhaetsya odnoj komandoj kogda ispolnenie programmy vyhodit iz dannoj oblasti vidimosti Perehod v upravlenii pamyatyu nevazhno ruchnom ili avtomaticheskom ot otdelnyh obektov k bolee krupnym edinicam vo mnogih sluchayah pozvolyaet uprostit uchyot vremeni zhizni obektov i odnovremenno snizit nakladnye rashody Realizacii raznoj stepeni avtomatizirovannosti regionalnogo upravleniya pamyatyu sushestvuyut dlya mnogih yazykov programmirovaniya vklyuchaya ML Prolog Si Cyclone Yazyk programmirovaniya Rust predlagaet koncepciyu vladeniya osnovannuyu na zhyostkom kontrole so storony kompilyatora sootvetstviya vremeni zhizni i oblasti vidimosti obektov Ideya sostoit v tom chto pri sozdanii obekta peremennaya kotoroj prisvaivaetsya ssylka na nego stanovitsya vladelcem etogo obekta i oblast vidimosti peremennoj vladelca ogranichivaet vremya zhizni obekta Pri vyhode iz oblasti vidimosti vladelca obekt avtomaticheski udalyaetsya Putyom prisvaivaniya ssylki na obekt drugoj peremennoj on mozhet byt zaimstvovan no zaimstvovanie vsegda vremenno i dolzhno byt zaversheno v predelah vremeni zhizni vladelca obekta Vladenie mozhet byt peredano drugoj peremennoj naprimer obekt mozhet byt sozdan vnutri funkcii i vozvrashyon v eyo rezultate no pri etom ishodnyj vladelec teryaet dostup k obektu V sovokupnosti pravila postroeny tak chtoby garantirovat nevozmozhnost nekontroliruemogo izmeneniya obekta cherez postoronnie ssylki Kompilyator staticheski otslezhivaet vremya zhizni obektov lyubaya operaciya kotoraya hotya by potencialno mozhet privesti k sohraneniyu ssylki na obekt posle vyhoda ego vladelca iz oblasti vidimosti privodit k oshibke kompilyacii chto isklyuchaet poyavlenie visyachih ssylok i utechek pamyati Takoj podhod uslozhnyaet tehniku programmirovaniya sootvetstvenno zatrudnyaya obuchenie yazyku no ustranyaet neobhodimost kak ruchnogo vydeleniya i osvobozhdeniya pamyati tak i ispolzovaniya sborki musora Upravlenie pamyatyu v konkretnyh yazykah i sistemahSborka musora kak nepremennyj atribut sredy ispolneniya programm ispolzuetsya v yazykah osnovannyh na deklarativnoj paradigme takih kak LISP ML Prolog Haskell Eyo neobhodimost v etom sluchae obuslovlena samim harakterom etih yazykov ne soderzhashih sredstv ruchnogo upravleniya vremenem zhizni obektov i ne imeyushih vozmozhnosti estestvennoj integracii podobnyh sredstv Osnovnoj slozhnoj strukturoj dannyh v takih yazykah obychno yavlyaetsya dinamicheskij odnosvyaznyj spisok sostoyashij iz dinamicheski vydelyaemyh spisochnyh yacheek Spiski postoyanno sozdayutsya kopiruyutsya dubliruyutsya komponuyutsya i razdelyayutsya chto delaet prakticheski nerealnym ruchnoe upravlenie vremenem zhizni kazhdoj vydelennoj spisochnoj yachejki V imperativnyh yazykah sborka musora yavlyaetsya odnim iz variantov naryadu s i nekotorymi alternativnymi metodikami upravleniya pamyatyu Zdes ona rassmatrivaetsya kak sredstvo uprosheniya programmirovaniya i predotvrasheniya oshibok Odnim iz pervyh kompiliruemyh imperativnyh yazykov so sborkoj musora stal Oberon prodemonstrirovavshij primenimost i dostatochno vysokuyu effektivnost etogo mehanizma dlya dannogo tipa yazykov no shirokuyu izvestnost i populyarnost dannomu podhodu prinyos yazyk Java Vposledstvii podhod Java byl povtoryon v srede NET i prakticheski vseh rabotayushih v nej yazykah nachinaya s C i Visual Basic NET V to zhe vremya poyavilos mnozhestvo interpretiruemyh yazykov JavaScript Python Ruby Lua kuda sborka musora vklyuchalas iz soobrazhenij dostupnosti yazyka dlya ne programmistov i uprosheniya kodirovaniya Uvelichenie moshnosti apparatury proishodivshee odnovremenno s sovershenstvovaniem samih sborshikov privelo k tomu chto dopolnitelnye nakladnye rashody na sborku musora perestali byt sushestvennymi Bolshinstvo sovremennyh imperativnyh yazykov so sborkoj musora voobshe ne imeyut vozmozhnostej dlya yavnogo ruchnogo udaleniya obektov naprimer operatora delete V sistemah ispolzuyushih interpretator ili kompilyaciyu v bajt kod sborshik musora yavlyaetsya chastyu sredy ispolneniya v teh zhe yazykah kotorye kompiliruyutsya v obektnyj kod processora on realizuetsya v vide obyazatelnoj sistemnoj biblioteki Imeetsya takzhe nebolshoe kolichestvo yazykov nim Modula 3 D podderzhivayushih kak ruchnoe tak i avtomaticheskoe upravlenie pamyatyu dlya chego prilozhenie ispolzuet dve otdelnye kuchi PrimechaniyaUstoyavshijsya termin s tochki zreniya russkogo yazyka pravilnee sbor musora vyderzhka iz slovarej ABBYY Lingvo Arhivnaya kopiya ot 25 aprelya 2017 na Wayback Machine slovar Ushakova sborka Arhivnaya kopiya ot 25 aprelya 2017 na Wayback Machine sbor Arhivnaya kopiya ot 25 aprelya 2017 na Wayback Machine sobrat Arhivnaya kopiya ot 25 aprelya 2017 na Wayback Machine Gramota ru obsuzhdenie Arhivnaya kopiya ot 25 aprelya 2017 na Wayback Machine Po slovaryu sborka eto soedinyaya otdelnye chasti detali sdelat sozdat chto nibud prevratit vo chto nibud gotovoe i k ostalnym znacheniyam slova sobrat primenyaetsya imenno sbor Navernyaka vy dumaete o sborke musora nepravilno Arhivnaya kopiya ot 19 iyulya 2013 na Wayback Machine Boehm H Advantages and Disadvantages of Conservative Garbage Collection angl Arhivirovano 24 iyulya 2013 goda ssylka iz Rejmond Erik Iskusstvo programmirovaniya dlya Unix rus 2005 S 357 544 s ISBN 5 8459 0791 8 Lutz Prechelt An empirical comparison of C C Java Perl Python Rexx and Tcl angl Tehnologicheskij institut Karlsrue Data obrasheniya 26 oktyabrya 2013 Arhivirovano 3 yanvarya 2020 goda RAII Dynamic Objects and Factories in C Roland Pibinger 3 May 2005 angl Data obrasheniya 14 fevralya 2016 Arhivirovano 5 marta 2016 goda V state ne hvataet ssylok na istochniki sm rekomendacii po poisku Informaciya dolzhna byt proveryaema inache ona mozhet byt udalena Vy mozhete otredaktirovat statyu dobaviv ssylki na avtoritetnye istochniki v vide snosok 20 oktyabrya 2024
