Какие стратегии и инструменты полезны для обнаружения утечек памяти в .NET?

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

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

https://help.github.com/articles/merging-multiple-user-accounts/

148
задан Peter Mortensen 31 March 2011 в 19:14
поделиться

10 ответов

Я использую Науку и технику MemProfiler, когда я подозреваю утечку памяти.

До сих пор, я нашел, что он очень надежен и мощен. Это убралось подобру-поздорову по крайней мере в одном случае.

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

51
ответ дан GEOCHET 31 March 2011 в 19:14
поделиться

Этот блог имеет некоторые действительно замечательные пошаговые демонстрации с помощью windbg и другие инструменты для разыскивания утечек памяти всех типов. Превосходное чтение для разработки навыков.

5
ответ дан twk 31 March 2011 в 19:14
поделиться

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

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

3
ответ дан Chris Ballard 31 March 2011 в 19:14
поделиться

Один из лучших инструментов использует эти Средства отладки для Windows и берет дамп памяти процесса с помощью adplus, затем используйте windbg и плагин sos для анализа памяти процесса, потоков и стеков вызовов.

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

Тогда анализируют офлайн.

2
ответ дан Stuart McConnell 31 March 2011 в 19:14
поделиться

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

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

2
ответ дан Gord 31 March 2011 в 19:14
поделиться

Большие пушки - Средства отладки для Windows

This удивительный набор инструментов. Можно проанализировать и управляемую и неуправляемую "кучу" с ним, и можно сделать это офлайн. Это было очень удобно для отладки одного из наших приложений ASP.NET, которые продолжали перерабатывать из-за злоупотребления памяти. Я только должен был создать полный дамп памяти живущего процесса, работающего на рабочем сервере, весь анализ был сделан офлайн в WinDbg. (Оказалось, что некоторый разработчик злоупотреблял устройство хранения данных Сессии в оперативной памяти.)

, "Если повреждено это..." блог имеет очень полезные статьи о предмете.

3
ответ дан Benoit Sanchez 31 March 2011 в 19:14
поделиться

Вы используете неуправляемый код? Если Вы не используете неуправляемый код, по данным Microsoft, утечки памяти в традиционном смысле не возможны.

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

От , Как определить утечки памяти в общеязыковой среде выполнения по Microsoft.com

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

Кроме того, проект, может только казаться, имеет утечку памяти. Это условие может произойти, если много больших объектов (таких как Объекты dataTable) объявляются и затем добавляются к набору (такому как DataSet). Ресурсы, что эти собственные объекты никогда не могут выпускаться, и ресурсы, остаются в живых для целого выполнения программы. Это, кажется, утечка, но на самом деле это - просто признак способа, которым память выделяется в программе.

Для контакта с этим типом проблемы, можно реализовать IDisposable. Если бы Вы хотите видеть некоторые стратегии контакта с управлением памятью, я предложил бы искать IDisposable, XNA, управление памятью , поскольку разработчики игр должны иметь более предсказуемую сборку "мусора" и так должны вынудить GC сделать свою вещь.

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

6
ответ дан Timothy Lee Russell 31 March 2011 в 19:14
поделиться

Только для forgetting-dispose проблемы, попробуйте решение, описанное в этом сообщении в блоге . Вот сущность:

    public void Dispose ()
    {
        // Dispose logic here ...

        // It's a bad error if someone forgets to call Dispose,
        // so in Debug builds, we put a finalizer in to detect
        // the error. If Dispose is called, we suppress the
        // finalizer.
#if DEBUG
        GC.SuppressFinalize(this);
#endif
    }

#if DEBUG
    ~TimedLock()
    {
        // If this finalizer runs, someone somewhere failed to
        // call Dispose, which means we've failed to leave
        // a monitor!
        System.Diagnostics.Debug.Fail("Undisposed lock");
    }
#endif
41
ответ дан Jay Bazuzi 31 March 2011 в 19:14
поделиться

Все еще необходимо волноваться о памяти, когда Вы пишете управляемый код, если Ваше приложение не тривиально. Я предложу две вещи: во-первых, читайте CLR через C#, потому что это поможет Вам понять управление памятью в.NET. Во-вторых, учитесь использовать инструмент как CLRProfiler (Microsoft). Это может дать Вам общее представление о том, что вызывает Вашу утечку памяти (например, можно смотреть на фрагментацию "кучи" для больших объектов)

7
ответ дан Zac Gochenour 31 March 2011 в 19:14
поделиться

Мы использовали Профилировщик Муравьев Pro программным обеспечением Red Gate в нашем проекте. Это работает действительно хорошо на всю.NET основанные на языке приложения.

Мы нашли, что Сборщик "мусора".NET "очень безопасен" в своей чистке объектов в оперативной памяти (как это должно быть). Это имело бы в наличии объекты просто, потому что мы могли бы использовать его когда-то в будущем. Это означало, что мы должны были быть более осторожны относительно количества объектов, которые мы расширили в памяти. В конце мы преобразовали все наши объекты данных к, "расширяются по запросу" (непосредственно перед тем, как поле требуют) для сокращения памяти наверху и выполнения увеличения.

РЕДАКТИРОВАНИЕ: вот дальнейшее объяснение того, под чем я подразумеваю, "расширяются по требованию". В нашей объектной модели нашей базы данных мы используем Свойства родительского объекта представить дочерний объект (объекты). Например, если бы у нас была некоторая запись, которая сослалась на некоторую другую запись "детали" или "поиска" на непосредственной основе, то мы структурировали бы его как это:

class ParentObject
   Private mRelatedObject as New CRelatedObject
   public Readonly property RelatedObject() as CRelatedObject
      get
         mRelatedObject.getWithID(RelatedObjectID)
         return mRelatedObject
      end get
   end property
End class

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

class ParentObject
   Private mRelatedObject as CRelatedObject
   Public ReadOnly Property RelatedObject() as CRelatedObject
      Get
         If mRelatedObject is Nothing
            mRelatedObject = New CRelatedObject
         End If
         If mRelatedObject.isEmptyObject
            mRelatedObject.getWithID(RelatedObjectID)
         End If
         return mRelatedObject
      end get
   end Property
end class

Это оказалось намного более эффективным, потому что объекты были не допущены в память, пока они не были необходимы (к Получить методу получили доступ). Это обеспечило очень большое повышение производительности ограничения хитов базы данных и огромного усиления на пространстве памяти.

17
ответ дан Mark 31 March 2011 в 19:14
поделиться
Другие вопросы по тегам:

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