Параллельная и фоновая сборка мусора
30C# --- Руководство по C# --- Параллельная и фоновая сборка мусора
Параллельная сборка мусора в версиях .NET 1.0 - .NET 3.5
До выхода версии .NET 4.0 очистка неиспользуемых объектов в исполняющей среде производилась с применением техники параллельной сборки мусора. В этой модели при выполнении сборки мусора для любых объектов поколения 0 или 1 (т.е. эфемерных поколений) сборщик мусора временно приостанавливал все активные потоки внутри текущего процесса, чтобы приложение не могло получить доступ к управляемой куче вплоть до завершения процесса сборки мусора.
Поток можно считать просто одним из путей выполнения внутри функционирующей программы. По завершении цикла сборки мусора приостановленным потокам разрешалось снова продолжать работу. К счастью, в .NET 3.5 (и предшествующих версиях) сборщик мусора был хорошо оптимизирован и потому связанные с этим короткие перерывы в работе приложения редко становились заметными (а то и вообще никогда).
Как и оптимизация, параллельная сборка мусора позволяла производить очистку объектов, которые не были обнаружены ни в одном из эфемерных поколений, в отдельном потоке. Это сокращало (но не устраняло) необходимость в приостановке активных потоков исполняющей средой .NET. Более того, параллельная сборка мусора позволяла программам продолжать размещать объекты в куче во время сборки объектов не эфемерных поколений.
Фоновая сборка мусора в версии .NET 4.0
В .NET 4.0 сборщик мусора по-другому решает вопрос с приостановкой потоков при очистке объектов в управляемой куче, используя при этом технику фоновой сборки мусора. Несмотря на ее название, это вовсе не означает, что вся сборка мусора теперь происходит в дополнительных фоновых потоках выполнения. На самом деле в случае фоновой сборки мусора для объектов, относящихся к не эфемерному поколению, исполняющая среда .NET теперь может производить сборку объектов эфемерных поколений в отдельном фоновом потоке.
Механизм сборки мусора в .NET 4.0 был улучшен так, чтобы на приостановку потока, связанного с деталями сборки мусора, требовалось меньше времени. Благодаря этим изменениям, процесс очистки неиспользуемых объектов поколения 0 или 1 стал оптимальным. Он позволяет получать более высокие показатели по производительности приложений (что действительно важно для систем, работающих в реальном времени и нуждающихся в небольших и предсказуемых перерывах на сборку мусора).
Однако следует понимать, что ввод такой новой модели сборки мусора никоим образом не отражается на способе построения приложений .NET. Теперь практически всегда можно просто позволять сборщику мусора .NET выполнять работу без непосредственного вмешательства со своей стороны (и радоваться тому, что разработчики в Microsoft продолжают улучшать процесс сборки мусора прозрачным образом :).