Введение

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

Классификация

Мусор обычно классифицируется на два типа: синтаксический мусор – любой объект или данные, находящиеся в пространстве памяти программы, но недостижимые из корневого набора программы; и семантический мусор – любой объект или данные, к которым работающая программа никогда не обращается ни при каких комбинациях входных данных. Объекты и данные, которые не являются мусором, называются живыми. Если говорить упрощенно, синтаксический мусор – это данные, до которых нельзя добраться, а семантический мусор – это данные, до которых не доберутся. Более точно, синтаксический мусор – это данные, недостижимые из-за графа ссылок (нет пути к ним), которые можно определить с помощью множества алгоритмов, как обсуждается при трассировочной сборке мусора, и для анализа которых требуется только рассмотрение данных, а не кода. Семантический мусор – это данные, к которым не будет осуществлен доступ, либо потому, что они недостижимы (и, следовательно, являются синтаксическим мусором), либо потому, что они достижимы, но к ним не будут обращаться; последнее требует анализа кода и, как правило, является неразрешимой задачей. Синтаксический мусор является (обычно строгим) подмножеством семантического мусора, поскольку объект вполне может содержать ссылку на другой объект, не используя при этом этот объект.

Эффекты

Мусор потребляет память кучи, и поэтому его необходимо собирать (для минимизации использования памяти, ускорения выделения памяти и предотвращения ошибок нехватки памяти за счет уменьшения фрагментации кучи и объема используемой памяти). Однако сбор мусора требует времени, а при ручной реализации – дополнительных затрат на кодирование. Более того, сбор мусора уничтожает объекты и, следовательно, может приводить к вызовам финализаторов, выполняющих потенциально произвольный код в непредсказуемый момент выполнения программы. Некорректный сбор мусора (освобождение памяти, которая не является мусором), в основном из-за ошибок при ручном управлении памятью (а не ошибок в сборщиках мусора), приводит к нарушениям безопасности памяти (которые часто создают уязвимости) из-за использования висячих указателей. Синтаксический мусор можно собирать автоматически, и сборщики мусора были широко изучены и разработаны. Семантический мусор в общем случае не может быть собран автоматически и, следовательно, вызывает утечки памяти даже в языках с автоматической сборкой мусора. Обнаружение и устранение семантического мусора обычно выполняется с помощью специализированного инструмента отладки, называемого профилировщиком кучи, который позволяет увидеть, какие объекты остаются в памяти и как они доступны, что позволяет удалить нежелательные ссылки.

Удаление мусора

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

Многие операционные системы освобождают память и ресурсы, используемые процессом или программой, при её завершении. Простые или короткоживущие программы, разработанные для работы в таких средах, могут завершаться и позволять операционной системе выполнять необходимое высвобождение ресурсов. В системах или языках программирования с ручным управлением памятью программист должен явно организовывать высвобождение памяти, когда она больше не нужна. C и C++ – два известных языка, поддерживающих такую модель. Сборка мусора использует различные алгоритмы для автоматического анализа состояния программы, определения мусора и его высвобождения без вмешательства программиста. Многие современные языки программирования, такие как Java и Haskell, предоставляют автоматическую сборку мусора. Однако это не новое явление, поскольку она также использовалась в более старых языках, таких как LISP. Ведутся постоянные исследования теоретико-типовых подходов (например, вывода областей) для идентификации и удаления мусора из программы. Общего теоретико-типового решения этой проблемы пока не разработано.