2009-03-18 18 views

ответ

11

This thread выглядит как раз то, что вы хотите.

Если я правильно читаю сообщение MVP, в 32-битной системе вы ограничены размером кучи размером 1,5 ГБ независимо от того, из чего вы получаете все, как только начнется процесс. В 64-битной системе ваша куча практически не ограничена, я не думаю, что какой-либо основной сервер или ПК может содержать столько физической памяти, сколько может обратиться к 64-битовому процессу.

+1

Что делать, если вы хотите ограничить размер кучи до установленной суммы? –

+0

Убедитесь, что вы построили свою сборку на x64 или любом CPU! Если вы создадите x86, то даже на OS/Hardware x64 у вас будет ограничение 1,5 ГБ. – Despertar

+0

Я думаю, что OP спрашивает, как ограничить кучу приложения .Net, чтобы использовать только 256 МБ. Он спрашивает, есть ли переменная аргумента/конфигурации/среды, которая сделает это, а не только увеличивая кучу. –

5

Насколько я понял, нет простого способа контролировать размер кучи приложения .NET с помощью CLR.

Ссылка в ответе @ Дейва только на половину ответа на вопрос. Когда я исследовал эту же проблему, ответ «Куча растет, чтобы использовать всю доступную память», как будто это единственная причина, по которой вы хотите контролировать максимальный размер кучи.

В средах сервера (обычно в Java) вы не хотите, чтобы приложение, работающее с плохой эксплуатацией, загружалось за счет других размещенных приложений. Простое решение - ограничить объем памяти, который приложение может использовать для своей кучи. Это достигается с помощью аргумента -Xmx Java, поэтому вы можете гарантировать, что приложение не будет использовать больше, чем планировалось, например. -Xmx256M. Так как выделение памяти в куче во время инициализации может замедлить запуск приложений, Java использует -Xms arg, чтобы приложения, которые много делают для создания объекта во время инициализации, начинают с большого блока кучи вместо JVM, постоянно изменяющего размер кучи, поскольку он идет.

.Net CLR не обладает этой способностью. Я подозреваю, что это потому, что CLR .Net не является виртуальной машиной. CLR - это API (достаточно полный, я могу добавить), который служит адаптером для родных .dll, которые приравниваются к подходу, гораздо более похожим на исполняемый файл, когда дело доходит до управления памятью.

Я задал этот вопрос о развитии SharePoint и слышал, что можно было бы контролировать кучу с помощью модулей IIS, называемых веб-приложениями, посредством которых вы можете сообщить IIS ограничить память данного веб-приложения. Интересно, связано ли это с тем, что IIS настроил подпрограммы, которые заменяют/переопределяют new()/malloc()/etc и, таким образом, могут предоставлять этот тип управления клиентским приложениям. Это означает, что автономные приложения .Net не повезло, если вы не хотите писать пользовательский диспетчер памяти на C++ и создавать интерфейс для .Net.

Суть в том, что программа CLR использует любые политики управления и управления памятью для управления хостингом процесс ставится на место. Вот почему вы должны контролировать использование вашей памяти на веб-странице C# из IIS, потому что IIS - это хост-процесс, который обеспечивает среду для выполнения кода CLR.

Смежные вопросы