Когда приемлемо назвать GC.Collect?

Измените последнее утверждение следующим образом:

EXEC('SELECT * FROM ' + @tablename)

Вот как я делаю свое действие в хранимой процедуре. Первый блок объявит переменную и задает имя таблицы на основе имени текущего года и месяца, в этом случае TEST_2012OCTOBER. Затем я проверяю, существует ли он в БД, и удалите, если это произойдет. Затем следующий блок будет использовать инструкцию SELECT INTO для создания таблицы и заполнить ее записями из другой таблицы параметрами.

--DECLARE TABLE NAME VARIABLE DYNAMICALLY
DECLARE @table_name varchar(max)
SET @table_name = 
    (SELECT 'TEST_'
            + DATENAME(YEAR,GETDATE())
            + UPPER(DATENAME(MONTH,GETDATE())) )

--DROP THE TABLE IF IT ALREADY EXISTS
IF EXISTS(SELECT name 
          FROM sysobjects 
          WHERE name = @table_name AND xtype = 'U')

BEGIN
    EXEC('drop table ' +  @table_name)
END

--CREATES TABLE FROM DYNAMIC VARIABLE AND INSERTS ROWS FROM ANOTHER TABLE
EXEC('SELECT * INTO ' + @table_name + ' FROM dbo.MASTER WHERE STATUS_CD = ''A''')
158
задан Brian Rasmussen 25 January 2009 в 20:04
поделиться

11 ответов

Если у Вас есть серьезное основание полагать, что значительный набор объектов - особенно те, которых Вы подозреваете, чтобы быть в поколениях 1 и 2 - теперь имеют право на сборку "мусора", и это теперь было бы подходящим временем для сбора с точки зрения маленького хита производительности.

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

ОБНОВЛЕНИЕ 07.02.2018

С.NET 4.5 - существует GCLatencyMode.LowLatency и GCLatencyMode.SustainedLowLatency. При вводе и отъезде любого из этих режимов, рекомендуется вызвать полный GC с GC.Collect(2, GCCollectionMode.Forced).

С.NET 4.6 - существует GC.TryStartNoGCRegion метод (раньше устанавливал значение только для чтения GCLatencyMode.NoGCRegion). Это может самостоятельно, выполнять полную сборку "мусора" блокирования в попытке освободить достаточно памяти, но, учитывая мы запрещаем GC в течение периода, я утверждал бы, что это - также хорошая идея выполнить полный GC прежде и после.

Источник: инженер Microsoft Ben Watson: Пишущий Высокоэффективный Код.NET , 2-й Ed. 2018.

См.:

148
ответ дан Ben Hall 4 November 2019 в 17:26
поделиться

Короткий ответ: никогда!

2
ответ дан BankZ 4 November 2019 в 17:26
поделиться

Взгляните на эту статью Rico Mariani. Он дает два правила, когда назвать GC.Collect (правило 1: "Не делайте"):

, Когда назвать GC.Collect ()

7
ответ дан M4N 4 November 2019 в 17:26
поделиться

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

, Если Вы собираетесь проснуться с промежутками, (времена набора) затем, Ваша программа должна быть создана для единственного выполнения (выполните задачу однажды), и затем завершите. Затем Вы настраиваете программу как запланированную задачу для выполнения в запланированных интервалах.

Таким образом, Вы не должны интересоваться вызовом GC.Collect, (который Вы должны редко , если когда-нибудь, должны сделать).

Однако у Rico Mariani есть большое сообщение в блоге на этом предмете, который может быть найден здесь:

http://blogs.msdn.com/ricom/archive/2004/11/29/271829.aspx

4
ответ дан casperOne 4 November 2019 в 17:26
поделиться

Можно назвать GC.Collect (), когда Вы знаете что-то о природе приложения, сборщик "мусора" не делает. Заманчиво думать, что, как автор, это вероятно. Однако истина является суммами GC к довольно правильно написанной и протестированной экспертной системе, и редко, чтобы Вы знали что-то о низкоуровневых путях выполнения кода, которые она не делает.

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

Однако большую часть времени GC достаточно умен, чтобы сделать это так или иначе.

10
ответ дан Joel Coehoorn 4 November 2019 в 17:26
поделиться

Один случай - когда Вы пробуете к коду модульного теста, который использует WeakReference.

18
ответ дан Brian 4 November 2019 в 17:26
поделиться

Я использую GC.Collect только при записи сырых тестовых буровых установок производительности/профилировщика; т.е. Я имею два (или больше) блоки кода для тестирования - что-то как:

GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
TestA(); // may allocate lots of transient objects
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
TestB(); // may allocate lots of transient objects
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
...

Так, чтобы TestA() и TestB() выполненный с максимально подобным состоянием - т.е. TestB() не становился прибитым просто, потому что TestA оставил его очень близко к переломному моменту.

классическим примером А была бы простая консоль exe (Main вид достаточно метода, который будет отправлен здесь, например), который показывает различие между циклично выполненной конкатенацией строк и StringBuilder.

, Если бы мне нужно что-то точное, затем это было бы двумя абсолютно независимыми тестами - но часто это достаточно, если мы просто хотим минимизировать (или нормализовать) GC во время тестов для получения грубого ощущения поведения.

Во время производственного кода? Я должен все же использовать его;-p

48
ответ дан Vlad Schnakovszki 4 November 2019 в 17:26
поделиться

Это настолько не относится к вопросу, но для XSLT преобразовывает в.NET (XSLCompiledTranform) затем, у Вас не могло бы быть выбора. Другой кандидат является управлением MSHTML.

0
ответ дан Chris S 4 November 2019 в 17:26
поделиться

Scott Holden запись в блоге на том, когда к (и если не к) GC.Collect вызова характерен для .NET Компактная Платформа , но правила обычно относятся ко всей управляемой разработке.

2
ответ дан Brandon Barkley 4 November 2019 в 17:26
поделиться

Другая причина состоит в том, когда Вам открыли SerialPort на USB COM port, и затем USB-устройство отключается. Поскольку SerialPort был открыт, ресурс содержит ссылку на ранее подключенный порт в реестре системы. Реестр системы будет затем содержать устаревшие данные , таким образом, список доступных портов будет неправильным. Поэтому порт должен быть закрыт.

Вызов SerialPort. Близко () на заходах судна в порт Располагают () на объекте, но это остается в памяти, пока сборка "мусора" на самом деле не работает, заставляя реестр остаться устаревшей, пока сборщик "мусора" не решает выпустить ресурс.

От https://stackoverflow.com/a/58810699/8685342:

try
{
    if (port != null)
        port.Close(); //this will throw an exception if the port was unplugged
}
catch (Exception ex) //of type 'System.IO.IOException'
{
    System.GC.Collect();
    System.GC.WaitForPendingFinalizers();
}

port = null;
0
ответ дан 23 November 2019 в 21:30
поделиться

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

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

Однако при некоторой пакетной обработке вы знаете больше, чем GC. Например, рассмотрим приложение, которое.

  • получает список имен файлов в командной строке.
  • Обрабатывает отдельный файл, а затем записывает результат в файл результатов.
  • При обработке файла, создает множество взаимосвязанных объектов, которые не могут быть собраны до завершения обработки файла (например, дерево синтаксического анализа)
  • Не сохраняет состояние соответствия между файлами, которые он обработал .

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

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

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

  • Не сохраняет состояние соответствия между обработанными файлами .
  • Вы можете убедить (после тщательного) тестирования, что вы должны принудительно выполнить полное сборка мусора после обработки каждого файла.

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

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

  • Не сохраняет состояние соответствия между обработанными файлами .
  • Вы можете убедить (после тщательного) тестирования, что вы должны принудительно выполнить полное сборка мусора после обработки каждого файла.

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

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

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

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

    Я бы предпочел API для сборки мусора, когда я мог бы давать ему подсказки об этом типе вещей без необходимости принудительно запускать сборщик мусора.

    См. также " Лакомые кусочки производительности Рико Мариани "

    29
    ответ дан 23 November 2019 в 21:30
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: