SuperMiQi Ответов: 2

Есть ли простой способ в C# обнаружить утечку памяти в процессе ?


Всем Привет.

Основываясь на system. diagnostics. process, я задаюсь вопросом, нельзя ли было бы контролировать использование памяти процессом и определить, растет ли память не так, как ожидалось ?
Это делается для того, чтобы иметь возможность вызывать gc.collect() при определенных условиях памяти.

Каково Ваше мнение на этот счет ?
Заранее большое вам спасибо.
С уважением.
Мики

Что я уже пробовал:

В настоящее время я использую gc.Collect, но я хотел бы настроить его в зависимости от состояния рабочей памяти.

Andy Lanng

Мусор собирается довольно регулярно и без подсказки. Утечка памяти в .Net довольно сложна, я имею в виду, что вы действительно должны попытаться утечь память.
Вы можете проверить приложение как запущенный процесс, но вам придется опросить этот процесс, чтобы получить обновления о его текущем использовании.

Основы сбора мусора

SuperMiQi

Привет Энди,
Большое вам спасибо за ваш ответ.
В настоящее время у меня есть процесс мониторинга, запущенный во время работы моего основного приложения.
Я думал добавить метод в это моноторное приложение, чтобы проверить, правильно ли работает рабочий набор и частная память. Когда критерий будет достигнут, я смогу вызвать gc. collect.

Может быть, я слишком много думаю.

А ты как думаешь?
Заранее большое вам спасибо.
С уважением.
Мики

[no name]

Почему вы думаете, что вам вообще нужно возиться с GC? Он очень хорошо справляется со своей работой, оптимизируясь на протяжении многих лет. У вас не должно быть никаких причин возиться с ним. Просто позволь ему делать свою работу.

Philippe Mori

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

SuperMiQi

Спасибо вам за ваш большой вклад.

Philippe Mori

Иногда вам просто нужно посмотреть на использование памяти под отладчиком при использовании вашего приложения.

Foothill

Утечка памяти В а .Сетевое приложение не так уж сложно в зависимости от того, что вы используете. Например, любой класс, реализующий интерфейс IDisposable, является потенциальной точкой утечки памяти. Самый простой способ, который я нашел, - это утечка памяти .Net заключается в создании объектов, основанных на конструкциях операционной системы, также известных как дескрипторы Win32 в C &C++, и не вызывающих Dispose (), когда они больше не нужны. Лучшее, что вы можете сделать, это избавиться от всех IDisposable объектов.

2 Ответов

Рейтинг:
1

Dave Kreskowiak

НЕ ВЫЗЫВАЕТ GC.Собирать(). Я Гарантирую Вам, что вы не знаете ничего больше о поведении ваших приложений привычки памяти сверх того, что GC знает о вашем приложении.

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

Кроме того, принудительный сбор не устраняет проблемы утечки памяти. Выясните, что протекает, и вместо этого устраните проблему. Профилировщики памяти .NET-лучшие инструменты для этой работы.

Кроме того, счетчики, которые вы видите в Диспетчере задач, лгут вам. Это не то, сколько памяти на самом деле использует ваше приложение. Это то, сколько .NET CLR зарезервировано для вашего приложения. Среда CLR .NET выделяет блоки памяти из Windows и добавляет их в управляемую кучу. (Это то, что вы видите в Диспетчере задач.) По мере загрузки и запуска приложения объекты выделяются из управляемой кучи. Когда объекты выходят за пределы области видимости, GC восстанавливает эту память, возвращая ее обратно в управляемую кучу, а не в WINDOWS.

Теперь, если Windows хочет, чтобы вернулась память, он просто спрашивает .Чистая среда CLR, чтобы вернуть все, что он может и среда CLR делает это очень красиво.

Все это делается в фоновом режиме, без вашего вмешательства.


Рейтинг:
0

RickZeeland

что-то вроде этого:

Process myProcess = Process.GetProcessById(pid);
var memoryUsage = Math.Max(myProcess.WorkingSet64, myProcess.PrivateMemorySize64);
var memoryMb = (int)(memoryUsage / (1024L * 1024L));