Высвобождение ресурсов
Atom
26.09.2013


При закрытии робота автоматическая сборка мусора полностью не производится, программа сидит в памяти и приходится её удалять вручную. Во время работы память (8 Гб) засоряется, что даже ведёт к зависанию компьютера и перезагрузке. В книгах по C# пишется, что все процессы очистки производятся автоматически. Соответственно вопрос: как мониторить, выявлять места утечки памяти и правильно закрывать приложение?

Теги:


Спасибо:


IvanB

Фотография
Дата: 26.09.2013
Ответить


Buratino Перейти
При закрытии робота автоматическая сборка мусора полностью не производится, программа сидит в памяти и приходится её удалять вручную. Во время работы память (8 Гб) засоряется, что даже ведёт к зависанию компьютера и перезагрузке. В книгах по C# пишется, что все процессы очистки производятся автоматически. Соответственно вопрос: как мониторить, выявлять места утечки памяти и правильно закрывать приложение?


Верно, платформа сама занимается очисткой памяти, но в некоторых случаях эта подсистема не может отследить утечки, например случай когда, программа создает поток, который в свою очередь использует некий ресурс, Вы или программа можете забыть о том что поток работает, и можете думать, что ресурс уже освобожден в памяти т.к. никем не используется, но на самом деле его использует бесконтрольный поток, и это только пример, на самом деле все может быть гораздо сильнее "закручено".
В подобных случаях помогают программы, отслеживающие создание/освобождение ресурсов конкретной программы, например инструмент: ants memory profiler, это очень удобная утилита, помогающая находить утечки памяти.
Спасибо: Bond

Buratino

Фотография
Дата: 26.09.2013
Ответить


IvanB Перейти

Верно, платформа сама занимается очисткой памяти, но в некоторых случаях эта подсистема не может отследить утечки, например случай когда, программа создает поток, который в свою очередь использует некий ресурс, Вы или программа можете забыть о том что поток работает, и можете думать, что ресурс уже освобожден в памяти т.к. никем не используется, но на самом деле его использует бесконтрольный поток, и это только пример, на самом деле все может быть гораздо сильнее "закручено".
В подобных случаях помогают программы, отслеживающие создание/освобождение ресурсов конкретной программы, например инструмент: ants memory profiler, это очень удобная утилита, помогающая находить утечки памяти.


Ну вот допустим я создаю поток thread и после его старта он начинает жить своей закрученной жизнью. Метод, указанный ниже, останавливает всё что он делает и высвобождает ресурсы? Или этого не достаточно, нужно лезть в глубь этого потока и там искать утечки?

Код

        protected override void OnClosing(CancelEventArgs e)
        {
            thread.Abort();
            base.OnClosing(e);
        }
Спасибо:

IvanB

Фотография
Дата: 26.09.2013
Ответить


Buratino Перейти
IvanB Перейти

Верно, платформа сама занимается очисткой памяти, но в некоторых случаях эта подсистема не может отследить утечки, например случай когда, программа создает поток, который в свою очередь использует некий ресурс, Вы или программа можете забыть о том что поток работает, и можете думать, что ресурс уже освобожден в памяти т.к. никем не используется, но на самом деле его использует бесконтрольный поток, и это только пример, на самом деле все может быть гораздо сильнее "закручено".
В подобных случаях помогают программы, отслеживающие создание/освобождение ресурсов конкретной программы, например инструмент: ants memory profiler, это очень удобная утилита, помогающая находить утечки памяти.


Ну вот допустим я создаю поток thread и после его старта он начинает жить своей закрученной жизнью. Метод, указанный ниже, останавливает всё что он делает и высвобождает ресурсы? Или этого не достаточно, нужно лезть в глубь этого потока и там искать утечки?

Код

        protected override void OnClosing(CancelEventArgs e)
        {
            thread.Abort();
            base.OnClosing(e);
        }


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

Buratino

Фотография
Дата: 26.09.2013
Ответить


IvanB Перейти


Код

        protected override void OnClosing(CancelEventArgs e)
        {
            thread.Abort();
            base.OnClosing(e);
        }


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


Вот в том то и вопрос: я их все таким образом уничтожил, но тем не менее приложение продолжает сидеть в памяти. Какие ещё есть способы обнаружения утечки, убивания процессов, финализаторов?
Спасибо:

support_Edu

Фотография
Дата: 27.09.2013
Ответить


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

Buratino

Фотография
Дата: 28.09.2013
Ответить


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


Может лучше попробуем решить проблему через TeamViwer? Черкните ваш скайп.
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy