Более эффективно вызывать сборщик мусора .net? - PullRequest
1 голос
/ 30 ноября 2009

Из-за накладных расходов, связанных с вызовом сборщика мусора в CLR, эффективнее ли его покинуть или принудительно собирать мусор, когда объекты выходят из области видимости?

Ответы [ 5 ]

8 голосов
/ 30 ноября 2009

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

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

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

5 голосов
/ 30 ноября 2009

В дополнение к комментариям Эндрю, необязательный вызов GC.Collect приведет к тому, что в противном случае эффективные коллекции Gen-0 будут помещаться в корзины Gen-1 и Gen-2, которые собираются гораздо реже. По иронии судьбы, это означает, что ваше приложение будет страдать от более длительного использования памяти, нарушая первоначальное намерение сократить использование памяти.

Одним из немногих случаев, когда необходим вызов GC.Collect, может быть взаимодействие с COM или Win32. Например, нередко COM-объекты в Office задерживаются дольше, чем предполагалось, потому что нет способа явно их уничтожить. Поэтому вы можете захотеть, чтобы обертки COM были GC в определенное время, и обычно за этим следует вызов WaitForPendingFinalizers.

5 голосов
/ 30 ноября 2009

В большинстве случаев не стоит вручную вызывать сборщик мусора. Вы будете удивлены, насколько эффективен алгоритм сбора мусора.

Если вы не работаете с финансовым приложением (например, с производным торговым приложением), которое требует от вас полного контроля времени вызова коллекторов. Но если вы идете по этому пути, может быть, вам стоит попробовать другой язык, такой как C ++

2 голосов
/ 30 ноября 2009

Люди, которые писали .NET и сборщик мусора, много думали об этом, чтобы вам не пришлось этого делать. Просто вызовите dispose на ваши объекты, когда это применимо, и не беспокойтесь об остальном.

1 голос
/ 14 июня 2011

Из-за накладных расходов, связанных с вызовом сборщика мусора в CLR, эффективнее ли его покинуть или принудительно собирать мусор, когда объекты выходят из области видимости?

Почти наверняка эффективнее оставить это в покое.

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

...