Я разрабатывал довольно большое приложение и загрузил его на свой сервер несколько дней назад. Теперь я обнаружил, что у него есть несколько утечек памяти.
Мой сервер работает под управлением Windows Server 2008 на 1 ГБ оперативной памяти. Когда у меня 0 человек онлайн, используется только 550-600mb. Когда один человек подключается к сети, память начинает стремительно расти, а если 3-4 человека подключены к сети, используется 1 ГБ памяти.
Приложение сделано в ASP.NET с AJAX. Он имеет множество панелей обновления, которые запускаются каждую секунду, и довольно много JavaScript. Он использует 5-7 сеансов в любое время. Я использую LINQ to SQL в качестве связи с базой данных.
Я попробовал perfmon.exe на моем сервере и обнаружил:
- Коллекция Gen 0 переходит с 0% до
100% в течение минут
- Коллекция 1 поколения
уходит от 0% до 50% в течение 5 минут
- Генерал 2 очень близок к 0% вообще
раз
- Всего байтов кучи увеличивается до
100% очень быстро
Я также провел анализ моей программы в Visual Studio. 8% моего общего времени выполнения выполняется в методах .ToList (), что правильно вызывается LINQ to SQL.
Мои теории ....
(1) Linq to SQL dataContext
Это может быть сумасшедшей вещью, но: на моем уровне доступа к данным у меня есть множество методов:
- AddSomethingToDatabase (); * * тысяча тридцать две
- AddSomethingElseToDatabase ();
- DeleteSomethingFromDatabase (); * 1 036 *
Каждый из них имеет следующую инициализацию:
GameDataContext db = new GameDataContext();
Это означает, что приведенное выше выражение выполняется почти каждую секунду или более.
(2) Нет объектов, реализующих IDisposable
Я должен быть честным: я никогда не работал с IDisposable. Насколько я прочитал, это может быть проблемой.
Кроме того, если это утечка, какие классы должны ее реализовать? У меня нет никаких операций ввода-вывода или других, только DataContext.
(3) Нагрузка UpdatePanels и jQuery
У меня есть страх, что загрузка панелей обновления может вызвать проблемы с производительностью, но я не знаю, как это проверить.
Итак, мой вопрос: есть идеи о том, что может быть утечка памяти? Есть идеи как найти утечку памяти? И есть идеи как это решить?
Я хотел бы услышать от кого-то, кто имеет опыт работы с ситуацией выше!
Спасибо,
Lars