Выигрыш из приложения замедляется

#visual-studio-2010 #memory-leaks #performance

#visual-studio-2010 #утечки памяти #Производительность

Вопрос:

Я создал приложение с использованием Visual Studio.NET, и это работает нормально. После того, как приложение используется более 2-3 часов, оно начинает замедляться, и я не знаю почему. Я использовал GC.Collect(); для решения проблем с утечкой памяти, но теперь у меня есть новая. Кто-нибудь знает решение?

Комментарии:

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

Ответ №1:

Если у вас действительно утечка памяти, простой вызов GC.Collect() ничего не даст. GarbageCollector может собирать только те объекты, на которые больше нет ссылок из других.

Если вы не очистите свои объекты должным образом, GC ничего не соберет.

При работе с потреблением памяти следует тщательно учитывать следующие шаблоны:

  1. Слабые события (документация MSDN здесь) Если вы не отмените подписку на события, подписавшиеся объекты никогда не будут выпущены в сборку мусора. GC.Collect() эти объекты не будут удалены, и они будут загромождать вашу память.

  2. Реализуйте IDisposable интерфейс (документация MSDN здесь) (я настоятельно рекомендую прочитать эту документацию, поскольку я видел много неправильных реализаций.) Вы всегда должны освобождать ресурсы, которые вы использовали. Вызывайте Dispose() для каждого объекта, который предлагает это!

  3. То же самое относится и к потокам. Всегда вызывайте Close() для каждого объекта, который предлагает это.

  4. Чтобы упростить пункты 2. и 3., вы можете использовать using блоки. (Документация MSDN здесь) Как только эти блоки кода выходят за пределы области видимости, они автоматически вызывают соответствующие методы Dispose() или Close() для данного объекта. Это то же самое, но более удобное, что и при использовании try... finally комбинации.

Комментарии:

1. есть ли большая разница с Debug и Release, потому что я выполнил развертывание в debug? это быстрее, когда я создаю свою установку в режиме выпуска?

2. В общем, приложения в режиме ВЫПУСКА будут немного быстрее, чем в режиме ОТЛАДКИ, потому что в режиме отладки «за кулисами» происходит много необычных вещей, которые не будут запускаться при развертывании в виде ВЫПУСКА. Но на GarbageCollector это не окажет большого влияния. Я думаю, что это идет в неправильном направлении.

Ответ №2:

Попробуйте профилировщик памяти, такой как профилировщик памяти ANTS. Сначала вам нужно понять, что происходит, затем вы можете подумать о том, как это исправить.

http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/