У меня проблемы с утечкой памяти в C #. Я вижу, что использование памяти в диспетчере процессов увеличивается на 10-20 МБ (и более), когда не нужно создавать новые объекты.
q1) У меня сложилось впечатление, что управляемые объекты будут автоматически удалены GC. Но когда я профилирую использование памяти с помощью dotTrace, кажется, что + 10 000 экземпляров (в показе новых / мертвых различий) базового объекта, который я написал. Я нашел место, где было бы течь, если бы это было C ++,
public void TriggerEvent(string tEvent)
{
oVariable tVar = GetVar(tEvent);
if (tVar != null)
sVariableParser.TriggerEvent(tVar);
else
{
tVar = new oVariable("@CXZ_TEMP_VAR", tEvent, 0, this);
tVar._BlockDependancies = true;
sVariableParser.TriggerEvent(tVar);
}
}
Где oVariable определяется как
class oVariable : IComparable
Похоже, что GC не удаляет новые переменные od, мне интересно, нужно ли мне реализовать oVariable как IDisposable и сделать специальный системный вызов, чтобы убедиться, что GC собирает его? В oVariable есть также несколько других пользовательских объектов, но у меня сложилось впечатление, что простыми объектами, которые не используют ничего внешнего (без COM-объектов и т. Д.), Нужно управлять автоматически, или я ошибаюсь, и я создал неуправляемые данные структуры?
q2) Даже если в памяти dotTrace Memory появилось много новых переменных, где их должно быть ноль (возможно, GC ленив), у меня все еще есть ощущение, что утечка памяти может происходить из оконных форм, в частности DataGridViews. Мне было интересно, может ли кто-нибудь сказать мне, нужно ли мне выполнять какие-либо конкретные вызовы функции освобождения памяти после вызова обновления / перерисовки DGV с использованием
tGridView.Invoke(new UpdateGridViewCallBack(RedrawGlobalsViewGridView), tGridView);
Я предполагал, что новый перезвонит уберет за собой.