Подтвердить что ты не робот

Максимальная доступная для .NET память?

Каков максимальный объем памяти, который можно достичь в управляемом коде .NET? Это зависит от реальной архитектуры (32/64 бит)?

4b9b3361

Ответ 1

Нет жесткой, точной цифры для .NET-кода.

Если вы запускаете 32-битную Windows; ваш процесс может адресовать до 2 ГБ, 3 ГБ, если переключатель /3GB используется в Windows Server 2003.

Если вы запускаете 64-битный процесс на 64-битной коробке, ваш процесс может адресовать до 8 ТБ адресного пространства, если присутствует много ОЗУ.

Однако это не вся история, поскольку CLR берет некоторые накладные расходы для каждого процесса. В то же время .NET попытается выделить новую память в куски; и если адресное пространство фрагментировано, это может означать, что вы не можете выделить больше памяти, даже если некоторые из них доступны.

Ответ 2

В С# 2.0 и 3.0 также существует ограничение 2G на размер одного объекта в управляемом коде.

Ответ 3

Объем памяти, которую может обрабатывать ваш .NET-процесс, зависит как от того, работает ли он на 32-битной машине, так и от того, работает ли она как агностик процессора или процессор.

По умолчанию процесс .NET является агностиком процессора, поэтому он будет работать с типом процесса, который является естественным для версии Windows. В 64 бит это будет 64-битный процесс, а в 32-битном случае это будет 32-битный процесс. Вы можете заставить .NET-процесс, хотя и нацелиться на конкретный процессор, и сказать, что заставить его работать как 32-битный процесс на 64-битной машине.

Если вы исключили настройку с большим адресом, то следующие различные раскладки

  • 32-битный процесс может адресовать 2 ГБ
  • 64-битный процесс может обращаться к 8TB

Вот ссылка на полное разбиение адресного пространства на основе различных опций, предоставляемых Windows.

http://msdn.microsoft.com/en-us/library/aa366778.aspx

Ответ 4

Для 64-битной Windows размер виртуальной памяти составляет 16 ТБ, разделенный поровну между режимом пользователя и ядра, поэтому пользовательские процессы могут обрабатывать 8 ТБ (8192 ГБ). Это меньше, чем все 16 EB пространство, адресуемое на 64 бита, но оно все еще намного больше, чем то, с чем мы привыкли 32 бит.

Ответ 5

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

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

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

Я надеюсь, что это понимание поможет несколько.

Я изначально ответил на что-то связанное здесь (я все еще новичок, поэтому не уверен, как я должен делать эти ссылки):

Есть ли предел памяти для одного .NET-процесса

Ответ 6

Время выполнения .NET может выделять всю свободную память, доступную для программ пользовательского режима на своем хосте. Имейте в виду, что это не означает, что вся эта память будет посвящена вашей программе, так как некоторые (относительно небольшие) части будут посвящены внутренним структурам данных CLR. В 32-битных системах, предполагая настройку 4 ГБ или более (даже если PAE включен), вы сможете получить примерно 2 ГБ, выделенные для вашего приложения. В 64-битных системах вы сможете получить 1 ТБ. Для получения дополнительной информации о ограничениях памяти Windows просмотрите эту страницу. Каждая цифра, упомянутая там, должна быть разделена на 2, так как окна резервируют более высокую половину адресного пространства для использования кодом, работающим в режиме ядра (кольцо 0). Кроме того, помните, что всякий раз, когда для 32-битной системы предел превышает 4 ГБ, подразумевается использование PAE, и, таким образом, вы все еще не можете превышают лимит 2 ГБ, если ОС не поддерживает 4gt, и в этом случае вы можете достичь до 3 ГБ.

Ответ 7

Да, в 32-битной среде вы ограничены адресным пространством 4 Гб, но Windows требует примерно половину. В 64-битной архитектуре это, ну, намного больше. Я считаю, что 4G * 4G

И на Compact Framework он обычно находится в порядке нескольких сотен МБ

Ответ 8

Я думаю, что другие ответы довольно наивны, в реальном мире после 2 ГБ потребления памяти ваше приложение будет вести себя очень плохо. По моему опыту графические интерфейсы, как правило, идут массово неуклюжими, неподъемными после большого количества потребления памяти.

Это был мой опыт, очевидно, что фактическая причина этого может быть слишком велика, поэтому все операции над этими объектами занимают слишком много времени.

Ответ 9

Следующее сообщение в блоге содержит подробные сведения о памяти x86 и x64 max. У него также есть небольшой инструмент (источник доступен), который позволяет легко ориентироваться в разных вариантах памяти: http://www.guylangston.net/blog/Article/MaxMemory.