Jagjot Singh Ответов: 6

Исключение System out of memory


Здравствуйте Друзья,

Я создал консольное приложение C#, которое мне нужно запускать 24/7, чтобы постоянно выполнять запросы к базе данных и выполнять тяжелые вычисления над вставленными данными. Он отлично работает в течение 24 часов, но после этого он дает памяти полное исключение.

Мне действительно нужно решение для этого.

Пожалуйста, предложите решение, любая помощь будет оценена по достоинству.

Спасибо,
Джагджот

jim lahey

не видя вашего кода, я не могу помочь решить эту проблему.

Вы могли бы настроить запланированную задачу для остановки и перезапуска вашего консольного приложения каждые 23 часа, я полагаю.

Jagjot Singh

Вот поток кода:

Цикл (бесконечный)
{
получение значений из базы данных;
выполнять вычисления;
сохраните значения в базе данных;
}

Yusuf

для меня это пахнет утечкой ресурсов. Проверьте использование ресурсов. Очистите [удалить, освободить] любой нежелательный ресурс.

6 Ответов

Рейтинг:
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 коммерческих инструмента (надеюсь, бесплатная пробная версия) + еще много чего.

(Джагджот,.. Я не думаю, что вы кого-то обидели или вас можно в чем-то обвинить, не будьте так подозрительны; я говорю вам это с открытым сердцем, без сарказма.)

Рейтинг:
2

#realJSOP

Вам нужно почитать об управлении памятью в .Net, а именно о большой куче.

http://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-large-object-heap/[^]

Для получения дополнительной информации выполните поиск в Google ".чистые большие кучи"


Рейтинг:
2

N a v a n e e t h

Кроме того, я думаю, что служба windows будет подходящим выбором для работы все время.


Рейтинг:
1

Richard Deeming

Этот вопрос был задан, на него ответили, и он был решен. ПЯТЬ ЛЕТ НАЗАД!