Ваш код утилизации не подходит. Итерирование коллекции изображений фактически создает новое растровое изображение для каждого изображения. Который вы потом сразу же утилизируете снова. Просто позвоните Clear ().
GC.Collect () также не может иметь никакого эффекта, класс ImageList является оболочкой для собственного компонента Windows. Который хранит изображения в собственной памяти, а не в сборщике мусора.
Последняя, но не менее важная проблема: диспетчер памяти Windows просто не работает так, как вы думаете. Он не уменьшает размер виртуальной памяти программы, когда освобождает память. Он просто помечает блок памяти как неиспользуемый и добавляет его в список свободных блоков. Готов к повторному использованию в более позднее время. Только в очень редком случае, когда освобождаемая память охватывает весь набор зарезервированных страниц памяти, она может уменьшить размер виртуальной памяти. Это не настоящая проблема. Это виртуально.