ASP.NET методы управления памятью - PullRequest
2 голосов
/ 27 мая 2010

У нас есть несколько разных проектов, использующих компоненты ASP.NET и DevExpress ASPxGridView. При разработке этих проектов использовалось несколько методов привязки данных, и теперь мы обнаруживаем, что некоторые из этих проектов поглощают всю память на сервере.

Первоначально мы использовали вызов хранимой процедуры и привязывали DataSet к представлению grid, но по рекомендации DX изменили его на ObjectDataSource и создали и объект, который в конечном итоге использует оператор Linq для DB и возвращает универсальный список объектов, который затем связан.

К сожалению, это не решает проблему под рукой. Мы все еще замечаем, как много памяти съедается, и я пытаюсь разобраться в этом. При работе через профилировщик памяти RedGate я замечаю, что существует множество строк, RuntimeTypeHandles и экземпляров моего объекта, создаваемых каждый раз, когда мы привязываемся к сетке.

DataBind выполняется при загрузке страницы, а сетка использует обратные ссылки при сортировке, но это приводит к утечке МБ памяти при каждой привязке, поэтому мне интересно, какие методы я могу использовать / лучшие практики для управления объектами, которые мы используем иметь контроль над? Я реализовал IDisposable в объекте данных, избавившись от контекста linq и установив для любых других объектов значение null, но, похоже, это не имеет значения. Кажется, я создаю экземпляр объекта данных при каждом вызове, и даже вызов dispose не имеет значения.

Ответы [ 2 ]

2 голосов
/ 27 мая 2010

Ух, там много сантехники и движущихся частей.

Можно ли немного сузить круг? То есть вы можете удалить материал со страницы и посмотреть, как он работает?

Простите, но когда вы говорите «утечка памяти», что вы имеете в виду и откуда вы знаете? GC 'ленивый' и не будет ничего делать, пока на него не будет оказано давление. Это хорошо, но это также означает, что память может накапливаться до тех пор, пока не понадобится коллекция, и тогда вы можете обнаружить, что она освобождает много. По этой причине профилировщики памяти часто выглядят как зуборезы.

Как вы храните данные сетки, чтобы заставить пейджинг работать? Я видел, что наборы данных сохранялись в viewstate, что означает, что данные отправляются клиенту вместе с сеткой. Если вы снова запрашиваете пост-обратную загрузку страницы, вы теряете там много места.

Еще одна распространенная проблема - подписка на события, позволяющая крупным объектам оставаться живыми дольше, чем они должны. Я действительно видел код, в котором сетка данных была помещена в состояние сеанса, которая поддерживала страницу в течение всего сеанса. На каждом пост-спине это происходило снова и снова до пуфа. В этом случае GC не может помочь нам, потому что объекты действительно все еще используются.

Поэтому попробуйте упростить - отключите сортировку, избавьтесь от стороннего контроля, используйте меньший набор данных и т. Д. Используя профилировщик памяти и что-то, что подвергает сервер нагрузке, измерьте этот сценарий. Если вы не обнаружили «утечек», то начните добавлять материал обратно, чтобы посмотреть, когда он выйдет из строя.

1 голос
/ 28 мая 2010

Возможно, вы каждый раз возвращаете слишком много данных на ваш сервер iis.Помните, что при использовании стандартного источника данных linq с сеткой devexpress каждый раз, когда вы выполняете обратный вызов для сортировки, подкачки или любого другого обратного вызова, все данные загружаются в память, а затем сортируются и разбиваются на страницы.вы загружаете очень большой объем данных, вы легко тратите впустую память сервера.Подумайте, что у вас может быть много пользователей, открывающих одну и ту же страницу, и это загрузит все данные в память для каждого пользователя, и у GC может не хватить времени, чтобы освободить все эти вещи.

DevExpress предоставляет для этого LinqServerModeDataSource , который выполняет всю подкачку и сортировку на сервере данных.

Если вы не можете использовать это, попробуйте получить меньший набор данных, отфильтровав его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...