Есть ли ограничение памяти для одного процесса .NET - PullRequest
34 голосов
/ 14 октября 2008

В настоящее время мы думаем о создании кеш-системы для хранения данных, извлеченных из базы данных SQL, и обеспечения их доступности для нескольких других приложений (веб-сайт, веб-сервис и т. Д.). Мы представляем, что кеш работает как служба Windows и в основном состоит из интеллектуального словаря, который содержит записи в кеш. У меня вопрос, есть ли ограничение на рабочий набор приложения (оно будет работать под Windows Server 2003)? Или количество физической памяти ограничено?

Ответы [ 6 ]

44 голосов
/ 14 октября 2008

32 бит или 64 бит? 32 бита - 2 ГБ (для процесса), 64 бита - 1 ТБ (сервер Enterprise Edition 2003) .

Однако максимальный размер объекта CLR составляет 2 ГБ даже на 64-разрядных.

Обновление: приведенная выше информация была верной в 2008 году. См. Ответ Охада для получения более новой информации Сервер Windows 2016 может иметь максимум 24 ТБ .

20 голосов
/ 16 декабря 2009

Недавно я проводил обширное профилирование по ограничениям памяти в .NET для 32-битного процесса. Нас всех закидывает идея, что мы можем выделить до 2,4 ГБ (2 ^ 31) в приложении .NET, но, к сожалению, это не так :(. Процесс приложения имеет так много места для использования, а операционная система делает большие Тем не менее, для нашей работы по управлению ею у нас .NET, похоже, есть свои собственные издержки, которые составляют примерно 600-800 МБ для типичных реальных приложений, которые увеличивают ограничение памяти. Это означает, что как только вы выделяете массив целых чисел, который занимает 1,4 ГБ, следует ожидать появления исключения OutOfMemoryException ().

Очевидно, что в 64-битной версии это ограничение наступает гораздо позже (давайте поговорим через 5 лет :)), но общий размер всего в памяти также увеличивается (я нахожу, что это ~ 1,7-2 раза) из-за увеличенного размера слова .

Что я точно знаю, так это то, что идея виртуальной памяти из операционной системы определенно НЕ дает вам практически бесконечное пространство для выделения в одном процессе. Только в этом случае все 2,4 ГБ памяти можно адресовать всем (многим) приложениям, работающим одновременно.

13 голосов
/ 18 сентября 2010

Следующая таблица из MSDN является наиболее точным ответом на ваш запрос. Обратите внимание, что флаг IMAGE_FILE_LARGE_ADDRESS_AWARE нельзя установить непосредственно из управляемого компилятора, хотя, к счастью, его можно установить после сборки с помощью утилиты editbin . 4GT относится к флагу / 3gb.

alt text

4 голосов
/ 14 октября 2008

В 32-битной Windows вы можете получить немного больше памяти, загрузив Windows с флагом / 3gb и пометив ваше приложение как «поддерживающее большие адреса»

1 голос
/ 15 октября 2008

Matthias

На самом деле это не ответ на прямой вопрос, а еще один способ решения этой проблемы, который позволит обойти некоторые большие ловушки, которые могут стать большой головной болью при использовании решений для кэширования. (Извините, я не рекомендую читать по этому вопросу.)

Мы реализовали это в предыдущем проекте, и это создало другие проблемы.

Для автономного доступа, можете ли вы использовать sql express на десктопах для создания зеркала вашей базы данных (или только той части, которая вам нужна для кэширования)? Тогда все, что вам нужно сделать, это переключить базу данных, на которую указывает ваше приложение. Вы даже можете использовать его для хранения различий и воспроизведения их на сервере - хотя это имеет другие проблемы. Вы можете изменить разрешения для локальной копии, чтобы сделать ее доступной только для чтения, если это так.

Словари, о которых вы думаете, создают удивительно похожие на индексы Sql. Я бы рассчитывал на то, что sql выполнит эту работу за вас, если вы сможете создать ее таким образом. Зачем изобретать это колесо? Если вы это сделаете, вам придется тщательно продумать срок действия кэша и управление памятью, особенно если это служба Windows.

Удачи,

Sam

0 голосов
/ 14 октября 2008

Как и в любой другой программе Windows, вы ограничены адресным пространством. То есть: на 32-битной вы можете иметь 2 ГБ адресного пространства. На x64 у вас может быть 8TB. ​​

Если у вас нет 8 ТБ физической памяти, она начнет отображаться.

...