GC приостанавливает текущие / все процессы? - PullRequest
1 голос
/ 12 февраля 2012

Эндрю Троелсен в своей книге Pro C # 2008 и платформе .NET 3.5, четвертое издание говорит, объясняя инструкцию newobj из CLR страница №.248, второй последний пункт

Сборщик мусора временно приостанавливает все активные потоки в текущем процессе , чтобы приложение не обращалось к куче во время процесса сбора

Если GC приостанавливает только текущий процесс , то как он гарантирует, что все процессы вместе с текущим процессом не могут получить доступ к куче и избежать какой-либо обработки объекта, который только что был собран, если GC обрабатывает всю кучуили Андрей просто подвел итог процесса для начинающих?

Ответы [ 2 ]

3 голосов
/ 12 февраля 2012

Это не проблема, каждый процесс получает свое собственное пространство виртуальной памяти. И поэтому своя куча. Другой процесс не может получить доступ к вашей куче, Windows создает большую стену между процессами, чтобы гарантировать, что один сбойный процесс не может дестабилизировать другой.

Процессы делают разделяют память, но только для кода, а не для данных. В ОЗУ имеется только одна копия кода инфраструктуры ngen-ed, CLR и джиттера, которые используются всеми процессами, выполняющими управляемый код. В остальном не имеет отношения к вопросу, что память не собирается мусором.

1 голос
/ 12 февраля 2012

Мы можем вернуться к факту, что CLR размещается на процесс. Тогда то, что описывает Эндрю, легче понять.

Сборщику мусора нужно только приостановить активные (управляемые) потоки в процессе, который размещает эту копию CLR, а затем начать сбор. Ему никогда не нужно переходить к другому процессу.

Ссылки:

http://technet.microsoft.com/en-us/query/678ysw69

CLR через C # book

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...