GC, вероятно, запускается и освобождает память ... для самого приложения. То есть, если Sleep()
вызовам нужно выделить некоторое ОЗУ, то он, вероятно, найдет его много, а именно большие блоки, которые изначально были выделены для огромного Dictionary
.
Это не означает, что ГХ вернул память операционной системе. С точки зрения ОС, большие блоки все еще могут быть частью процесса, которые не могут использоваться другими процессами.
Распределение не оптимизировано, потому что это некоторый внешний код. Ваш класс Main
вызывает конструктор для Dictionary<int,int>
, который может сделать что угодно , возможно, с различными побочными эффектами. Как человек-программист, вы ожидаете , что у конструктора не будет внешних видимых побочных эффектов, но компилятор и виртуальная машина этого точно не знают. Таким образом, код не может обойтись без реального создания экземпляра Dictionary<int,int>
и вызова его конструктора. Точно так же конструктор Dictionary<int,int>
не знает, что он вызывается для объекта, который скоро станет недоступным, поэтому он не может оптимизировать себя.