Выделение больше чем 1 000 МБ памяти в 32-разрядном процессе.NET

Lua цели больше в удобочитаемости, чем краткость, все же делает честные 37 символы:

function p(s)return s==s:reverse()end

вариант, только для забавы (тот же размер):

p=function(s)return s==s:reverse''end

версия JavaScript является более подробной (55 символов), потому что она не делает имеет строковую функцию реверса:

function p(s){return s==s.split('').reverse().join('')}
20
задан Stefan Schultze 12 July 2009 в 13:34
поделиться

3 ответа

Предел виртуального адресного пространства для процесса Win32 составляет 1,5 ГБ (не совсем верно). Кроме того, в .NET framework есть ограничение на процент памяти процесс .NET может потреблять. В файле machine.config есть элемент processModel с атрибутом memoryLimit, который представляет собой% доступной памяти, которую может использовать процесс. Значение по умолчанию - 60%.

Если машина, на которой вы работаете, имеет 2 ГБ памяти или вы не включили переключатель / 3 ГБ в BOOT.INI, тогда вы получите ~ 1,3 ГБ памяти на процесс.

Я не могу найти статью в базе знаний, но если я правильно помню, .NET 1.x не может обращаться за пределами лимита 1,5 ГБ (1,8 ГБ?) Независимо от ваших настроек.

http://blogs.msdn.com/tmarq/archive/2007/06/25/some-history-on-the-asp-net-cache-memory-limits.aspx http : //social.msdn.microsoft.com/Forums/en-US/clr/thread/c50ea343-b41b-467d-a457-c5a735e4dfff http://www.guidanceshare.com/wiki/ASP.NET_1.1_Performance_Guidelines_ -_Caching # Configure_the_Memory_Limit

7
ответ дан 30 November 2019 в 01:05
поделиться

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

Проблема здесь в поиске непрерывного блока. Вы можете попробовать включить режим 3 ГБ (что может помочь найти еще несколько байтов), но я действительно не советую этого делать. Вот ответы:

  • используйте меньше памяти
  • используйте базу данных / файловую систему
  • используйте x64

Вы также можете прочитать блог Эрика Липперта (у него, кажется, есть блог запись для каждого распространенного вопроса .NET ...)

16
ответ дан 30 November 2019 в 01:05
поделиться

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

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

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

Надеюсь, это понимание поможет.

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

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

2
ответ дан 30 November 2019 в 01:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: