ASPX.NET приложение из-за нехватки памяти без причины - PullRequest
0 голосов
/ 25 мая 2011

Вот в чем дело: когда мой веб-сервер запускается, он создает пару длинных (20M элементов) массивов с очень маленькими объектами (например, 1-2-3 дюйма). Накопительный размер любого отдельного массива НЕ превышает 2 ГБ (ограничение CLR, некоторые подробности см. По ссылке ниже). W3wp.exe действительно увеличивает использование памяти близко к 2 ГБ (никогда больше). Код скомпилирован в режиме платформы Any CPU и работает в Windows 7 x64 с 8 ГБ ОЗУ.

Что на самом деле заставляет выбрасывать OutOfMemoryException при создании моих списков? Имеет ли какое-то значение, если я размещаю процесс через IIS или VS? Это, кажется, не происходит, ПРОД, но я испытываю это на моей машине разработчика все время. (Сейчас попробую перезагрузить ...)

Это может быть связано, но у меня нет таких больших объектов: Очень большая коллекция в .Net вызывает исключение нехватки памяти

EDIT: Это имеет значение для запуска в IIS или VS - не вижу, что происходит, когда процесс запускается в IIS. Так может ли быть ограничение VS отладчика?

Ответы [ 3 ]

1 голос
/ 25 мая 2011

Исходя из вашего обновленного вопроса, очевидно, что Visual Studio не работает в 64-битном режиме.Таким образом, ваше ограничение составляет 2 ГБ в Visual Studio.

Этот пост, вероятно, содержит некоторый код, полезный для доказательства этого факта: Как обнаружить 64-битную платформу Windows с .NET?

0 голосов
/ 25 мая 2011

Проверьте, установлен ли порог утилизации apppool на 2 ГБ http://technet.microsoft.com/en-us/library/cc732519%28WS.10%29.aspx

0 голосов
/ 25 мая 2011

Возможно, выделение памяти не оптимизировано (т.е. выполняется небольшими шагами и изменяет размеры).Это может привести к фрагментации кучи таким образом, что нехватки свободного места больше не будет достаточно для хранения «полужесткого» массива.

Это распределение не выполняется, и эта ситуацияопределение OOM, хотя может быть доступно множество фрагментов кучи.Обычно чрезмерное использование linq может вызвать это;в определенный момент отложенное выполнение теряет свою привлекательность, и вы можете купить много производительности / ресурсов, выполнив один или два «.ToList ()» в стратегических местах (по моему опыту, часто близко к началу вашего процесса генерации, гдебольшая часть данных поступает).

...