Память процесса по сравнению с памятью Распределение памяти AppDomain

Предположим, у меня есть приложение .Net App.exe, которое создает три домена: DomainA, DomainB и DomainC.

Можно ли сказать, что CLR выделяет процессу App.exe некоторый объем физической памяти, а затем эта память делится в какой-то пропорции между нашими тремя доменами?

Или для каждого нового домена дается новая отдельная порция памяти независимо от памяти, выделенной для App.exe и других доменов?

Простыми словами: могу ли я представить себе логическое распределение памяти как (последовательную) ленту с песнями (где песни — это AppDomans), или как некую FAT32, где файлы расположены случайным образом и мы просто знаем их расположение на диске?


person user2341923    schedule 30.08.2013    source источник


Ответы (2)


Можно ли сказать, что CLR выделяет процессу App.exe некоторый объем физической памяти?

Нельзя так сказать, процесс в Windows выделяет только виртуальную память. Отображение виртуальной памяти в физическую память (ОЗУ) строго входит в обязанности операционной системы. Оперативная память должна совместно использоваться всеми процессами, работающими на машине, и это делается динамически. Сумма выделений виртуальной памяти всех процессов обычно значительно превышает объем оперативной памяти. Когда процесс обращается к виртуальной памяти, ошибка страницы сопоставляет страницу виртуальной памяти с ОЗУ. При необходимости данные в оперативной памяти удаляются или сохраняются в файле подкачки, чтобы освободить место.

AppDomains совместно используют один набор куч GC (поколения с 0 по 2 и куча больших объектов), и их распределения перемешаны. Они отделены своими корнями, каждый AppDomain имеет свою собственную кучу для статических переменных, свои собственные GCHandles и свой собственный набор фреймов стека потоков с локальными переменными.

person Hans Passant    schedule 30.08.2013

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

Я считаю, что JVM использует статическое распределение размера кучи по неизвестным мне причинам. CLR отличается.

person usr    schedule 30.08.2013