Рейтинг:
50
Estys
Убедитесь, что вы Dispose
ваших объектов SqlConnection и SqlCommand.
Полагаю, вы ими пользуетесь.
Какой-нибудь неуправляемый код?
Овации
Jagjot Singh
Я избавляюсь от объектов SqlConnection и SqlCommand. Дело в том, что приложение работает в бесконечном цикле. Поэтому в циклическом режиме трудно освободить ресурсы.
Sergey Alexandrovich Kryukov
@Jagjot: трудно в цикле? Нет, это не так. Это трудно без зацикливания, потому что труднее обнаружить проблему.
Sergey Alexandrovich Kryukov
@Jagjot: возможно, вам нужно показать более подробный код. Вы, конечно, делаете что-то еще.
Sergey Alexandrovich Kryukov
@Estys: мои 5, но... еще одна идея в моем ответе.
Jagjot Singh
никакого неуправляемого кода.
Sergey Alexandrovich Kryukov
Джагджот, даже если у вас нет неуправляемого кода, это не причина для того, чтобы не иметь утечки. Пожалуйста, внимательно прочтите мой ответ и все проверьте. Спросите меня, не получили ли вы его.
wizardzz
Вы когда-нибудь делаете какой-либо выход на нить, на которой работает петля, или просто возвращаетесь обратно к вершине?
Рейтинг:
42
Dave Kreskowiak
У вас либо где-то произошла утечка памяти (сомнительно, но возможно), либо утечка ручки. И то, и другое даст вам ошибку нехватки памяти.
Вы можете увидеть, есть ли у вас утечка дескриптора, открыв TaskManager, перейдите в раздел просмотр, выберите столбцы... и включите дескрипторы. Начните свой процесс и позвольте ему пройти несколько итераций. Запишите цифры, которые вы получите. Затем возвращайтесь через несколько часов и сравните цифры. Если номера дескрипторов значительно выше,вы не избавляетесь от объекта, чем должны.
Я бы счел это вполне возможным, если ваш процесс превышает от 5 000 до 8 000 дескрипторов. Я видел, как плохие убегающие процессы потребляют более 100 000 дескрипторов (очень плохо!), прежде чем Windows начинает делать очень странные вещи.
Это также может быть не ваш процесс, который вызывает проблему, так что посмотрите на все!
Эта ошибка возникает довольно часто, когда новички пытаются сделать свой собственный рисунок в приложении Windows Forms, не зная, что они должны утилизировать каждый созданный ими объект GDI, обычно ручки и кисти. В конечном итоге они создают новую ручку или кисть при каждом вызове своего события Paint, никогда не избавляясь от предыдущих, и в конечном итоге они получают ошибку Out Of Memory.
Sergey Alexandrovich Kryukov
Полезные направления - мой 5
Jagjot Singh
Очень полезные инструкции, я обнаружил, что количество ручек для моего приложения увеличивается со временем. Я считаю, что неправильно распоряжаюсь предметами.
Рейтинг:
30
Sergey Alexandrovich Kryukov
Я согласен с ответом Эстис, но вы говорите, что это не сработало для вас-пока. Итак, в дополнение к этому:
Вы не должны предполагать, что утечка памяти невозможна только потому, что работает сборка мусора. Многие люди допускают утечку, держа мусоросборник. Именно ваш дизайн приложения подвержен этой проблеме. Например, если вы улучшите производительность вычислений, добавив некоторые промежуточные значения, найденные в базе данных, в какой-то словарь или другой контейнер, он будет содержать ссылки, если вы забудете очистить контейнер. (Возможно, Вам также придется узнать о слабых ссылках.)
Так что проверьте и свою расчетную часть.
Спросите себя: какие переменные доступны вне цикла. Проверьте, избавьтесь от них как можно больше.
Кроме того, соберите некоторую статистику потребления памяти через циклы цикла.
Jagjot Singh
Я не могу сказать, что я не согласен с Эстис. Если приложение выдает исключение" из памяти", это, безусловно, означает, что что-то действительно не так. Я только что сказал, что приложение имеет цикл, и оно полностью написано с использованием C#.net. Нет неуправляемого кода, такого как win 32 DLL и т. д. Я постараюсь внести изменения в свой код и постараюсь исправить проблемы в соответствии с вашими предложениями.
Sergey Alexandrovich Kryukov
>" Я не могу сказать, что я не согласен с Эстис."
Джагджот, никто не обвинял тебя в том, что ты сделал что-то не так или не понял Эстис. Я только предлагаю другой возможный способ утечки. Моя точка зрения заключается в другом: управляемый код также может вызвать утечку (несмотря на распространенное заблуждение, это может быть). Пожалуйста, внимательно прочтите и попробуйте проверить.
Jagjot Singh
как мы можем найти утечки памяти?. Мне очень жаль, если кто-то обиделся моими комментариями.
Sergey Alexandrovich Kryukov
Я никогда не использовал специальные инструменты с .NET (но широко использовался для нативного программирования Windows), и у меня было очень мало проблем с памятью, и я легко решал их вручную (поверьте, нет), поэтому я просто знаю, что есть некоторые инструменты, которые я никогда не использовал.
Это работа над кодовым проектом:
http://www.codeproject.com/KB/dotnet/Memory_Leak_Detection.aspx
Кроме того, я просто погуглил:
обнаружение утечки ".net"
Я дал мне почти миллион результатов, вершина списка была довольно хорошей релевантностью, 3 коммерческих инструмента (надеюсь, бесплатная пробная версия) + еще много чего.
(Джагджот,.. Я не думаю, что вы кого-то обидели или вас можно в чем-то обвинить, не будьте так подозрительны; я говорю вам это с открытым сердцем, без сарказма.)