Как я могу использовать сборщик мусора? - PullRequest
3 голосов
/ 06 июля 2010

Ничего не зная о GC и никогда не имея необходимости его использовать (или я так думаю), каково его типичное использование и как может я / моя система извлечь выгоду, если я сам приобрету навыки и узнаю больше о GC?

ОБНОВЛЕНИЕ ... как мне упростить работу ГХ?

Ответы [ 10 ]

14 голосов
/ 06 июля 2010

Типичное использование GC - вообще не использовать его, а просто позволить CLR обрабатывать все за вас.

3 голосов
/ 06 июля 2010

ОБНОВЛЕНИЕ ... как я могу сделать вещи проще для ГХ?

Самый простой способ упростить задачу для GC - позволить ему выполнять свою работу без вмешательства. Это оптимизирует, когда это должно бежать самостоятельно.

Я бы посмотрел, когда использовать Финализатор в C #. Это одна из областей, где вы можете помочь ГК.

Понимание кучи больших объектов может быть полезным, так как это может вызвать проблемы.

http://techiemate.blogspot.com/2009/04/garbage-collection-in-net.html

2 голосов
/ 06 июля 2010

Лучший способ использовать сборщик мусора - это ...

Не пытайтесь использовать его!

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

1 голос
/ 06 июля 2010

Несколько советов по кодированию с учетом GC: * ​​1001 *

  1. Обязательно снимайте регистрацию обработчиков событий, когда вы их больше не используете.Это наиболее распространенный способ, которым объекты остаются живыми после истечения их предполагаемого срока службы и могут также вызывать ошибки, если у объекта Disposed есть обработчики событий.

  2. Если вы взаимодействуете снеуправляемый код, вам нужно больше знать о совместном использовании управляемой памяти с неуправляемым кодом.Возможно, вам придется использовать пиннинг и / или GC.KeepAlive, чтобы помочь GC понять, что нужно вашему неуправляемому коду.Постарайтесь свести к минимуму закрепление, так как это усложняет работу ГХ.

  3. Практически никогда не нужно реализовывать финализатор.Если у класса есть финализатор, он также должен реализовать ту же очистку, что и IDisposable, и после удаления вызывать GC.SuppressFinalize(this), поскольку это помогает ГХ эффективно очищать после вашего класса.

1 голос
/ 06 июля 2010

Чтобы упростить работу GC, всегда вызывайте Dispose () для любого объекта, который поддерживает интерфейс IDisposable.

1 голос
/ 06 июля 2010

GC не похож на деструктор, который вы определили бы в C ++.То есть вам не нужно его определять и освобождать ранее выделенную память.Весь смысл GC в том, что он автоматический.Я рекомендую дать нам больше информации о том, что вы пытаетесь сделать / понять, потому что это не кажется безопасным.

0 голосов
/ 09 декабря 2011

Ничего не зная о GC и никогда не имея необходимости его использовать (или, я так думаю), каково его типичное использование и как может я / моя система извлечь выгоду, если я сам приобрету навыки и узнаю большео GC?

Вы можете использовать знания о сборке мусора для повышения пропускной способности и задержки программного обеспечения, которое вы пишете.

ОБНОВЛЕНИЕ ... как я могу сделать вещипроще для GC?

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

0 голосов
/ 06 июля 2010

В стиле управления памятью, обычно используемом в C, информация, которая отслеживает, какие области кучи свободны или выделены, отделена от информации, которая указывает, какие области фактически используются.Когда информация о куче больше не нужна, код должен явно пометить ее как нераспределенную, иначе она может остаться выделенной навсегда.

Система на основе сборки мусора рассматривает все ссылки на объекты кучи в системе какокончательный индикатор, для которого используются объекты.Поскольку было бы непрактично сканировать все ссылки на объекты в системе каждый раз, когда объект был выделен, система эффективно «пакетирует» работу: до тех пор, пока в куче остается свободное пространство памяти, память просто выделяется объектам последовательно.Не предпринимается никаких попыток освободить какое-либо пространство, пока куча не будет переполнена.

Объект будет считаться «использованным», если какой-либо поток содержит ссылку на него в локальной переменной или если хранится какая-либо глобальная переменнаяссылка на него, или если объект, который считается «использованным», содержит ссылку на него в любом поле.Компилятор обычно может сказать, будет ли локальная переменная, которая содержит ссылку на объект, фактически никогда не использоваться, но он не может делать такие определения с глобальными переменными или полями объекта.Если объект, который будет полезен, содержит ссылку на объект, которая больше никогда не будет использоваться, эта ссылка должна быть установлена ​​на ноль (Nothing в VB).Если этого не сделать, бесполезный объект будет «поддерживаться в живых», пока полезный объект есть.Если полезный объект похож на основную форму приложения, результатом может быть утечка памяти, которая сохраняется до тех пор, пока приложение остается открытым.

0 голосов
/ 06 июля 2010

Всегда полезно понять, как это работает; но в большинстве случаев вам не нужно слишком беспокоиться.

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

0 голосов
/ 06 июля 2010

Если вы не замечаете, что используете GC, значит, вы используете его и используете правильно.

Знание внутреннего устройства ГХ начинает иметь значение, только если вы используете его неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...