Я предполагаю, что память, которую вы съели, не является управляемой памятью.Вот ключевая проблема: GC знает только об управляемой памяти.Если вы имеете дело с другими объектами, которые имеют «след» за пределами управляемого мира - например,файлы, COM-объекты, соединения с базой данных, окна и т. д. - они будут занимать память в этом процессе, но поскольку GC знает только об управляемой части своего пространства, неуправляемая часть может расти и расти без GC.понимая, что нужна коллекция.
Или, другими словами, GC отлично подходит для управления чистой памятью , но паршиво управляет ресурсами (файлами, объектами COM,РУЧКИ, окна и т. Д.) - если вы интенсивно их используете, вам может потребоваться активно закрывать / утилизировать или иным образом очищать их, как только вы покончили с ними, и не полагаться на GC.
пример, который вы приводите с объектом + string, является чисто управляемым, здесь нет ресурсов, поэтому, скорее всего, он достигнет некоторого верхнего предела, начнется сбор, и он выровняется, но не замедлит работу системы (по крайней мере, не слишком сильно)!).
Какие объекты вы фактически создаете / используете в цикле?Если они являются оболочками для внешних ресурсов, таких как соединения с базой данных или аналогичные, проверьте, реализуют ли они IDispose, а затем используйте .Dispose или шаблон using (), или посмотрите, есть ли Close / Disconnect или другой метод для освобождения ресурса.