Это может быть вопрос, который стоит на высшем уровне, но я тип, который видит то, что прилипает к стене. При всех преимуществах памяти и управления жизненным циклом, обеспечиваемых сборкой времени, собранной мусором, были ли какие-либо заметные случаи неопределенности программы, вызванной условиями гонки между приложением и сборщиком мусора? Появился ли гештальт защитного программирования против такого рода вещей? Разумеется, программисты, привыкшие к RAII, должны изучать уроки, когда в присутствии GC.побочные эффекты сбора мусора?
ответ
Я думаю, вы неправильно поняли, как работает сборщик мусора. Условия гонки между приложением и правильно реализованным сборщиком мусора невозможны, даже в принципе. Сборщик мусора собирает только объекты, которые приложение не имеет доступа к.
Поскольку только один из двух может когда-либо «владеть» данным объектом, условия гонки не могут произойти.
Когда я переехал в мир .NET шесть лет, я чувствовал себя неловко с GC, и я вроде как считал само собой разумеющимся, что он должен быть намного медленнее и что я должен быть еще более осторожным с моей памятью чтобы избежать создания свиней.
Через шесть лет я могу сказать, что моя перспектива полностью изменилась! Я могу только вспомнить время в течение этих лет, когда у меня была утечка памяти из-за забытого .Dispose(). Сравните это с C++, где вы производите утечку памяти каждый час кодирования ... ;-)
Я был вынужден вернуться в мир C++, и я полностью ошеломлен! Я использовал для работы с этим и как это один раз? Это чувствует, что я по меньшей мере в 10 раз более продуктивен в C#, чем в C++. И вдобавок ко всему: распределитель памяти ГК настолько невероятно быстро, что я до сих пор не могу поверить. Посмотрите на этот вопрос, где мне пришлось сделать вывод, что в моем конкретном случае версия .NET (C# или C++/CLI) выполняется в 10 раз быстрее, чем версия C++ MFC: C++ string memory allocation.
Я полностью переделал, но мне потребовалось много времени, чтобы полностью его принять.
Технически, забыли утилизировать() дает утечку ресурсов. Но благодаря GC, которые являются только временными, финализаторы обеспечивают систему безопасности, которую неуправляемые языки просто не имеют. –
В моем случае, действительно * WAS * утечка! Это было вокруг в течение долгого времени, прежде чем я понял, откуда он произошел. Это связано с тем, что элемент управления Tab заполняется с помощью UserControls, полученных из TabPage. Это было очень интересно, и я * попробовал * изолировать его самостоятельно, чтобы продемонстрировать ... –
«Утечка» может произойти только тогда, когда класс не имеет финализатора (т. Е. Не работает) или когда блокируется некоторая скрытая ссылка Это.Это может случиться легко с событиями. –
Проблема с сборкой мусора заключается в том, что он управляет ресурсами памяти. К сожалению, программисты должны управлять много, много других типов ресурсов:
- файл и гнездо обрабатывает
- соединения с базой данных
- синхронизации Объекты
- Gui ресурсы
назвать лишь несколько. Чтобы успешно справляться с этим, вам действительно нужны концепции, воплощенные в идиоме RAII.
Когда я впервые начал программирование на C, я должен был быть очень методичным с моими malloc и realloc, и мне пришлось освобождать все, что я не использовал. Это была простая задача с крошечными заданиями колледжа, такими как создание двоичного дерева. Простой ...
Теперь, когда я начал разрабатывать приложение с графическим интерфейсом, написанным на всех C, мне приходилось больше думать и программировать из-за того, что я должен обратить внимание на возможные утечки памяти. Это стало хлопот. Я бы предпочел иметь половину продукта, чем половину продукта ass'd.
Я начал переходить на Java и C#.Мне нравилось, что все, что мне нужно было сделать, это разыменовать объект, и сборщик мусора придет и возьмет его за меня. Я также заметил, что мои программы работали немного медленнее с использованием Swing Java (как и ожидалось), но это было управляемо.
В моих выводах, поскольку процессоры становятся все дешевле, а память становится все дешевле и быстрее, а программы GUI потребляют больше памяти, чем раньше. Сборщик мусора действительно помогает получить продукт, который работает с минимальными проблемами с утечками памяти. Действительно удобна и может привести к плохой привычке кодирования, однако те могут быть исправлены.
EDIT:
Also see this это может помочь вам ответить на ваши вопросы. Хорошо прочитано IMO
Они могут после того, как вы начнете рассмотрение вопроса о завершении (и даже более того, как только вы начнете делать такие вещи, как воскресающие объекты ...) –
В правильно реализованной системе GC вы не сможете «воскресить» объект, который имеет право на сбор мусора, так как у вас не будет возможности ссылаться на него. Аналогично, объект, подлежащий завершению, не подлежит сбору, так как вы все еще можете ссылаться на него. – MarkusQ
В CLR вы можете получить условия гонки вокруг финализации. Прочтите это, в котором подчеркивается одно: http://blogs.msdn.com/cbrumme/archive/2003/04/19/51365.aspx –