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

Высвобождение ресурсов
Atom
9/26/2013


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



Thanks:


IvanB

Avatar
Date: 9/26/2013
Reply


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


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

Buratino

Avatar
Date: 9/26/2013
Reply


IvanB Go to

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


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

Code

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

IvanB

Avatar
Date: 9/26/2013
Reply


Buratino Go to
IvanB Go to

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


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

Code

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


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

Buratino

Avatar
Date: 9/26/2013
Reply


IvanB Go to


Code

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


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


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

support_Edu

Avatar
Date: 9/27/2013
Reply


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

Buratino

Avatar
Date: 9/28/2013
Reply


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


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


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy