Сборка мусора против утечек
Одна из главных причин, по которой я избегаю сбора мусора, - это избегание утечек ресурсов в областях, где утечка критически важна. Сборка мусора хороша, когда ваша цель - безопасность и простота, но не во избежание утечки программного обеспечения.
Распространенный сценарий, с которым мы столкнулись в GC, заключается в том, что с ним трудно избежать утечек ресурсов.
Теперь это может сбить с толку некоторых людей и показаться парадоксальным в том, что сборка мусора в сочетании с неидеальными командными практиками может привести к утечке программного обеспечения, но нетривиальное управление ресурсами в программном обеспечении не связано с ресурсами, привязанными к ограниченный охват, но постоянные, которые задерживаются.
Комплексное управление ресурсами
Примером такой сложности является граф сцены в трехмерном программном обеспечении с миллионами строк кода и тысячами объектов и классов, взаимодействующих друг с другом посредством событий.
В этих случаях эти постоянные объекты часто хранят дескрипторы / ссылки на ресурсы в системе, возможно, другие объекты, живущие в постоянном графе сцены. В таких сценариях у вас может быть центральный ресурс R
, подобный сложной трехмерной модели, занимающей сотни мегабайт оперативной памяти, доступ к которой осуществляется многими различными частями сцены и пользовательским интерфейсом. Например, и камера, и объект освещения могут хранить список ссылок на объекты, которые необходимо исключить из вида камеры и системы освещения, из которых могут быть включены такие сложные 3D-модели.
В этих случаях и в командной среде нередко 3 отдельных разработчика пишут код, который хранит постоянные дескрипторы / ссылки на R
в десятках различных мест в коде. Когда пользователь удаляет R
, , все из этих мест должны освободить дескриптор / ссылку.
Без сборки мусора, если одному из них не удастся это сделать (возможно, у него / нее был плохой день, он является одним из менее опытных разработчиков, находился в затруднительном положении из-за сжатых сроков с проигравшим) тестирование и проверка стандартов, независимо от причины), остается висящий указатель / дескриптор / ссылка . Доступ к нему будет сбой приложение с segfault. Отслеживание такого segfault с помощью отладчика часто сразу показывает, где и почему это произошло.
При сборке мусора не может произойти ничего очевидного, за исключением того, что при работе программного обеспечения в течение более длительных периодов времени происходит утечка все большего и большего количества ресурсов. Поскольку в одном из этих мест забыли освободить ссылку, постоянно увеличивая срок ее службы, и продолжать использовать ее в действительном неразрушенном состоянии, программное обеспечение может не только продолжать увеличивать использование памяти, но и становиться медленнее и медленнее, чем дольше вы работаете он обрабатывает скрытые объекты, которые больше не видны пользователям.
Сбой или не сбой
В таких случаях иногда очевидный и явный сбой, возникающий в результате этой ошибки, которая может быть немедленно обнаружена и обработана во время тестирования, на самом деле предпочтительнее для тихой и очень трудно обнаруживаемой утечки ресурсов, которая может быть кошмаром, чтобы отследить и никогда не может быть исправлено.
Так что, если вы работаете над таким проектом, где сразу очевидный и исправимый сбой во время тестирования может быть действительно предпочтительнее негерметичного программного обеспечения, которое часто вылетает под радар тестирования с такими ошибками, сбор мусора, если он не сочетается с очень осторожным Стандарты кодирования и осведомленность каждого члена команды о том, как следить за его ошибками (например, необходимость в слабых или фантомных ссылках), может принести больше вреда, чем пользы. На мой взгляд, сборка мусора лучше всего работает с гораздо меньшими, более тесными командами и проектами с фактически более высоким , не более низким уровнем знаний в области управления состоянием / ресурсами, или теми, где такие утечки ресурсов не так уж и плохи. как сбой.
С точки зрения разработчика, находящегося в окопах, явная, в вашем лице, ошибка демонстрации часто предпочтительнее, чем очень тонкая, скрытая «никто не знает, что случилось, но случилось что-то плохое» вид ошибок. Часто это говорит о том, что ваш отладчик рассказывает вам о том, что произошло, и вслепую пытается найти иголку в стоге сена из миллионов строк кода. Управление ресурсами в крупномасштабных системах - одна из самых сложных вещей, которую нужно понять, и сборка мусора на самом деле не делает это легче. Вопрос в том, падать или не падать, вот в чем вопрос, и в этих сценариях мы часто смотрим на сбой висячей ручки без GC или на таинственную утечку ресурсов с ним. В приложениях, критичных к производительности, имеющих дело с потенциально огромными ресурсами, такие утечки часто недопустимы.