Главная arrow С++ (часть 4) arrow Когда собирать мусор?

Когда собирать мусор?

Прежде чем приступить к разработке сборщика мусора, надо ответить еще на один, последний вопрос: когда собирать мусор? Ответ на него менее важен для многопоточного сборщика мусора, который может выполняться постоянно как фоновая задача сбора мусора, когда есть время у процессора, и становится насущным для разрабатываемого в этой главе однопоточного сборщика мусора, который должен приостанавливать работу программы для очистки памяти.
На практике сбор мусора выполняется только тогда, когда есть весомая причина для этого — такая как исчерпание доступной памяти. Такой подход оправдан. Во-первых, некоторые алгоритмы, например, маркировки и очистки, не позволяют выяснить наличие фрагментов неиспользованной памяти без запуска процесса сбора мусора (т. е. иногда нельзя узнать, есть ли мусор, пока не начнешь его собирать). Во-вторых, сбор мусора — процесс, требующий затрат времени, который не стоит выполнять без нужды.
Однако ожидание момента уменьшения объема доступной памяти для начала сбора мусора не соответствует цели, поставленной в этой главе, так как может сделать невозможной демонстрацию работы созданного сборщика. Предлагаемый вашему вниманию сборщик будет собирать мусор чаще, поэтому вам будет легко следить за его работой. В соответствии с кодом сборщика, мусор собирается, когда указатель выходит за пределы области видимости1 (out of scope). Конечно, заданное поведение можно легко изменить для удовлетворения нужд ваших приложений.
Еще одно, последнее замечание: при использовании сбора мусора, основанного на счетчиках ссылок, технически возможно освобождать неиспользуемую память, как только счетчик ссылок объекта стал равен нулю, без применения отдельной фазы сбора мусора. Но такой подход добавляет дополнительные расходы к каждой операции с указателем. В этой главе применяется метод, который просто уменьшает на единицу количество ссылок, хранящихся в счетчике, каждый раз, когда указатель на этот фрагмент памяти перенаправляется на другой участок памяти, а процесс действительной очистки памяти происходит в более удобное время. Этот технический прием уменьшает затраты времени во время выполнения программы, связанные с операциями указателей, которые хотелось бы выполнять как можно быстрее.
 
купить авто в эмиратах.