Есть ли способ узнать, что поддерживает жизнь объектов в C # - PullRequest
4 голосов
/ 08 августа 2010

Я пытаюсь оптимизировать использование памяти программой и поэтому хочу удалить объекты, когда они больше не нужны.Чтобы проверить, работает ли это правильно, я написал метод console.writeline в деструкторе типа объекта, который я хочу удалить.Однако, когда я тестирую программу, строки не пишутся (только когда программа, конечно, завершается).

Есть ли способ получить список объектов, событий, ... которые поддерживают определенный объект живым ине допустить его устранения сборщиком мусора.Или есть профилировщик, отладчик, который может сделать это (если возможно, MonoDevelop-совместимый)?

Ответы [ 4 ]

4 голосов
/ 08 августа 2010

WinDbg + SOS может помочь понять это. Но на это нужно время. Например,

Где ваша утечка в? [Использование WinDbg, SOS и GCRoot для диагностики утечки памяти .NET]

4 голосов
/ 08 августа 2010

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

я не знаю профилировщика в моно среде, но этот профилировщик достаточно хорош в windows.

3 голосов
/ 08 августа 2010

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

Чтобы исправить это, используйте профилировщик памяти, который определит «корни», удерживающие ваши объекты, выяснит, почему на них все еще ссылаются, и исправьте ошибку, приводящую к тому, что на объект все еще ссылаются.

Некоторые коммерческие и бесплатные профилировщики памяти:

2 голосов
/ 08 августа 2010

Распределение ресурсов требует ресурсов. Если сборщик мусора не обнаружит, что используется слишком много памяти, он не освободит свои ресурсы. Если вам нужен детерминированный «деструктор», реализуйте IDisposable. Смотрите также ключевое слово "using"

...