Как работает выделения памяти под поколения объектов в куче в C#?
Имеется вопрос по части сборки мусора в C#, как я понял память выделяемая под хип зависит от разрядности процесса,
Для 32 - 1.5гб
Для 64 - 8тб
У каждого из 3 поколений объектов в хипе имеются свои ограничения по памяти, и когда память выделяемая под 0 поколение заканчивается, то бишь не удается разместить новый объект, происходит сборка мусора, все выжившие объекты из 0 поколения переходят в поколение 1, первый вопрос - отчего зависит выделяемая память под определенные поколения и в каких диапазонах оно может варьироваться, занимается ли этим исключительно CLR или можно вручную выставить необходимое количество памяти в ручную и что произайдет если нам нужно будет содержать очень большое количество объектов, изменит ли CLR динамически место для каждого поколения?
Далее, у меня есть некоторое противоречие по алгоритму работы GC, как я понял, GC вызывается(во время работы приложения) из-за нехватки памяти в 0 поколении, и если после его очистки ему не хватает памяти то только тогда он переходит к следующему поколению, но с другой стороны, GC при очистке мусора может "запомнить" что например в 1 поколении уже нету места и при следующем заполнении поколения 0 очистит сначала первое 1 а потом уже 0. Вообщем второй вопрос - как это на самом деле работает, да и чем поможет очистка поколения 1 или 2 если нам нужно разместить новый объект в поколении 0?
Василий Банников, Ну, имеется ввиду что чаще всего во время работы приложение. Так то мне известно что он может вызываться в случае:
1. Когда CLR обнаруживает что объем поколения 0 достиг своего порогового значения.
2. Вызов статического метода Collect объекта System.GC