Предположим, у меня есть приложение .Net App.exe, которое создает три домена: DomainA, DomainB и DomainC.
Можно ли сказать, что CLR выделяет процессу App.exe некоторый объем физической памяти, а затем эта память делится в какой-то пропорции между нашими тремя доменами?
Или для каждого нового домена дается новая отдельная порция памяти независимо от памяти, выделенной для App.exe и других доменов?
Простыми словами: могу ли я представить себе логическое распределение памяти как (последовательную) ленту с песнями (где песни - это AppDomans), или как некую FAT32, где файлы расположены случайным образом и мы просто знаем их расположение на диске?
Ответ 1 · рейтинг 6 · Hans Passant
Можно ли сказать, что CLR выделяет процессу App.exe некоторый объем физической памяти?
Нельзя так сказать, процесс в Windows выделяет только виртуальную память. Отображение виртуальной памяти в физическую память (ОЗУ) строго входит в обязанности операционной системы. Оперативная память должна совместно использоваться всеми процессами, работающими на машине, и это делается динамически. Сумма выделений виртуальной памяти всех процессов обычно значительно превышает объем оперативной памяти. Когда процесс обращается к виртуальной памяти, ошибка страницы сопоставляет страницу виртуальной памяти с ОЗУ. При необходимости данные в оперативной памяти удаляются или сохраняются в файле подкачки, чтобы освободить место.
AppDomains совместно используют один набор куч GC (поколения с 0 по 2 и куча больших объектов), и их распределения перемешаны. Они отделены своими корнями, каждый AppDomain имеет свою собственную кучу для статических переменных, свои собственные GCHandles и свой собственный набор фреймов стека потоков с локальными переменными.
Ответ 2 · рейтинг 2 · usr
Вся память, управляемая CLR, является глобальной для процесса. AppDomains здесь роли не играют. Неважно, сколько у вас AppDomains, выделение всегда происходит из одной и той же глобальной кучи. Куча расширяется и сжимается по мере необходимости. Статического выделения памяти нет.
Я считаю, что JVM использует статическое распределение размера кучи по неизвестным мне причинам. CLR отличается.