2016-11-06 8 views
0

Как я понимаю, когда режим GC GC включен для приложения .NET, он выделяет логическую кучу на процессор, где потоки, запланированные на каждом процессоре, будут выделять память.Что происходит, когда запланированное продолжение запланировано на другом процессоре (логические кучи GC)?

Что происходит с памятью, выделенной Task с несколькими ожиданиями? Он потенциально может быть выполнен на любом потоке ThreadPool, поэтому он может перепрыгивать между логическими кучами.

Сохраняется ли память, выделенная на предыдущей логической куче, в текущую исполняемую логическую кучу? Есть ли какая-либо стоимость, чтобы не выполнять продолжения Task на той же логической куче/ядре?

+2

Неправильный ментальной модели. Объекты уже живут в разных сегментах кучи без сервераGC: gen # 0 до # 2 и LOH. Таким образом, больше сегментов в serverGC не является зависанием. Более продуктивным является думать, что он собирает мусор на нескольких процессорах. –

ответ

2

Что происходит с памятью, выделенной для задачи с несколькими ожиданиями? Он потенциально может быть выполнен на любом потоке ThreadPool, поэтому он может перепрыгивать между логическими кучами.

Нить имеет видимость во всем адресном пространстве, независимо от логического разделения. Объекты кучи могут указывать на разные объекты в другой куче без границы. Имейте в виду, что разные потоки могут быть запланированы на одном процессоре в разных временных срезах.

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

Нет, это повлечет за собой поразительное поразительное время выполнения, если время выполнения было вынуждено копировать объекты между кучами. Опять же, тот факт, что поток может не работать на той же логической куче, которая его выделяла, не означает, что он не может ссылаться на эту кучу. Идея, лежащая в основе кучи на ядро, состоит в том, чтобы иметь возможность масштабировать распределения и иметь возможность создавать параллельные коллекции gc.

+0

Спасибо, что нашли время ответить Ювалю, это имеет смысл. Не могли бы вы рассказать о том, как это улучшает сбор? И GC должен был приостановить все потоки, чтобы сделать сборку для одной логической кучи? – WiseGuyEh