Как предотвратить или минимизировать негативные последствия .NET GC в приложении реального времени? - PullRequest
0 голосов
/ 09 октября 2010

Существуют ли какие-либо советы, приемы и приемы для предотвращения или сведения к минимуму замедлений или временного зависания приложения из-за .NET GC?

Может быть что-то вроде:

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

Ответы [ 3 ]

5 голосов
/ 09 октября 2010

Описание вашего приложения не соответствует обычному значению «в реальном времени». Реальное время обычно используется для программного обеспечения с максимальной задержкой в ​​миллисекундах или меньше.

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

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

Но если ваш "пользовательский опыт" действительно пострадает, это, вероятно, не будет GC.

3 голосов
/ 09 октября 2010

ИМХО, если GC заметно влияет на производительность вашего приложения, что-то не так.ГХ предназначен для работы без вмешательства и без существенного влияния на ваше приложение.Другими словами, вам не нужно кодировать с учетом деталей GC.

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

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

2 голосов
/ 09 октября 2010

Еще один прием - использовать GC.RegisterForFullNotifications на сервере.

Допустим, у вас есть сервер балансировки нагрузки и приложение N. сервера. Когда балансировщик нагрузки получает информацию о возможном полном GC на одном из серверов, он некоторое время будет пересылать запросы на другие серверы, поэтому GC не будет затрагивать SLA (что особенно полезно для блоков x64, где можно адресовать более 4 ГБ).

Обновлено

Нет, к сожалению, у меня нет кода, но на MSDN.com есть очень простой пример с фиктивными методами, такими как RedirectRequests и AcceptRequests , который можно найти здесь: Уведомления о вывозе мусора

...