Сборка мусора в программировании

Сборкой мусора называют процесс выявления и освобождения не используемой памяти. Всё это происходит без участия программиста. Примерами языков, в которых реализована сборка мусора, являются С#, Java, Lisp и Python.


Сборка мусора имеет ряд преимуществ перед освобождением памяти вручную. Удается избавиться от ошибок, связанных с повисшими указателями, множественным освобождением памяти и ее утечками. Одновременно упрощается проектирование программы и интерфейса, так как сложные механизмы, традиционно применяемые для корректного освобождения памяти, становятся ненужными. Кроме того, программистам больше не приходится заботиться об этом аспекте, а значит, написание программы занимает меньше времени.


Сборка мусора в программировании

Сборка мусора имеет и свои недостатки. Программы сборки мусора порой работают медленно из-за того, что системе приходится определять, когда освобождать и возвращать память, которая больше не нужна. Кроме того, система может выделить слишком много памяти, и в нужное время её может просто не хватить.


Одним из методов сборки мусора является подсчёт ссылок. При этом отслеживается количество ссылающихся на объект переменных. Изначально на фрагмент памяти имеется всего одна ссылка. Но этот параметр увеличивается при копировании ссылок в переменные.


При этом, когда ссылающаяся на объект переменная меняет свое значение или выходит за границы области видимости, счетчик ссылок на объект уменьшается на единицу. Как только его значение становится равным 0, связанная с объектом память освобождается: отсутствие ссылок на объект означает, что этот объект больше не нужен.


Подсчёт ссылок является простой и относительно быстрой операцией. Память освобождается и становится доступной для повторного использования сразу же после исчезновения всех ссылок на объект, что обычно является преимуществом. Однако реализацию этого простого алгоритма затрудняют циклические ссылки.


Посмотрим, что произойдет в случае кольцевого связного списка при отсутствии на него внешних указателей. Счетчик ссылок каждого элемента списка отличен от нуля, но при этом на данный участок памяти не ссылается ни один объект, не входящий в сам список. Это означает, что данный участок памяти можно без последствий освободить, но простой сборщик мусора, в основе которого лежит алгоритм подсчета ссылок, не сможет этого сделать.


Одним из механизмов борьбы с данной проблемой являются слабые ссылки. Именно так называются ссылки, не включенные в счетчик. Если каждый цикл подсчёта ссылок в структуре данных содержит слабую ссылку, значит, при исчезновении последней внешней ссылки выделенную под структуру память можно освободить.


К примеру, рассмотрим двунаправленный список: в простой системе с подсчетом ссылок каждая пара смежных элементов будет формировать цикл, поэтому освобождения памяти не произойдет даже при отсутствии внешних ссылок. Если же определить все «предыдущие» ссылки как слабые, при отсутствии внешних ссылок на список счетчик ссылок начального элемента списка обнулится, и память можно будет освободить.


Простыми словами о ядре Linux Что такое VPN?