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

Могу ли я (и когда захочу) установить максимальный размер кучи в .net?

Исходя из фона java, одна из вещей, к которым я привык, сообщает JVM, какой должен быть максимальный размер кучи. Если запущенная программа пытается усвоить больше, чем разрешено, и сборщик мусора не может освободить больше ресурсов, то OutOfMemoryError будет выброшен, и все это будет ударом. Поэтому настройка максимального размера кучи важна в Java.

Это применимо в .net? Можете ли вы установить ограничения размера кучи? Сохраняет ли CLR свою кучу до тех пор, пока она не достигнет физических пределов машины? Или это не проблема в .net по какой-то тонкой причине, что мои Java-мошенники мешают мне видеть?

4b9b3361

Ответ 1

Вы не можете установить максимальный размер кучи в .Net, если вы не принимаете CLR самостоятельно в процессе.

Изменить: Чтобы управлять распределением памяти CLR, включая максимальный размер кучи, вам нужно использовать хостинг api для размещения clr и, в частности, использовать "интерфейсы менеджера памяти", некоторые сведения о стартере можно найти здесь Журнал MSDN, колонка CLR Inside Out: API-интерфейсы CLR для хостинга

Изменить: чтобы ответить на вопрос, почему вы хотите контролировать распределение памяти или, в частности, максимальный размер кучи, обычно не хотите, но if вы пишете приложение, которое например SQL Server или IIS или какое-то приложение в реальном времени, у вас есть достаточно веская причина иметь контроль над памятью и, в частности, избегать пейджинга, иначе сама CLR и ОС уже сделают вам очень хорошую работу, а то, что осталось заключается в том, чтобы обеспечить, чтобы ваше приложение использовало минимальные ресурсы для того, чтобы все хорошо работало.

Ответ 2

Нет, он не применяется в .NET. Куча действительно продолжает расти, пока она не может расти. (Очевидно, что это "после попытки восстановить память через GC, вырастить кучу".) В принципе, в .NET GC не так много настроек, как в Java. Вы можете выбрать сервер GC или клиентский, и я думаю, что есть возможность включения/выключения параллельного GC (я найду ссылки через минуту), но в основном это.

EDIT: Кажется, там немного больше, хотя и не огромная сумма. запись в блоге Рика Минериха по настройкам GC и следующий знать больше, чем я об этом. Вероятно, они являются хорошей отправной точкой для любого дальнейшего исследования, но они скорее являются флажками, а не теми ограничениями памяти, которые доступны в JVM.

РЕДАКТИРОВАТЬ: Поп-ответ поднимает хороший момент - я принимал "нормальную" модель хостинга CLR (т.е. не под вашим контролем). Если вы хотите сделать это самостоятельно, вы, скорее всего, получите больше контроля - за счет дополнительной работы по его размещению. Я не могу сказать, что я когда-либо рассматривал эту сторону вещей.

Ответ 4

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

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

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

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

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