в процессе могут быть разные нити, они могут выполняться на разных процессорах, у них могут быть собственные кучи. И может быть общая куча всего процесса для объектов, общих для нескольких нитей.
Обычно предполагается, что есть только эта последняя куча, а кучек помельче для отдельных нитей нет, только стеки (и thread local storage там же на стеке).
Что мешает сделать разные трассировщики для разных областей?
Могут ещё сказать, мол, что есть процессы - и вот как раз у них кучи независимые. Но при этом все ругаются, что distributed garbage collection не работает.
Предыдущее обсуждение скатилось в терминологический спор (про трассировку и подсчёт количества ссылок). А хотелось бы обсудить это всё в терминах графов. Объекты где-то находятся (лежат в куче), они могут быть обнаружены каким-то способом, независимым от наличия ссылок на них. Достижимые от корневых ссылок объекты образуют одну часть графа, недостижимые объекты - другие части графа. Хотелось бы описать, что такое «области» в каких-нибудь более формализованных терминах. Есть же, к примеру, слово «шарнир» и другие. Может быть можно как-то автоматизированно делить на них граф живых объектов автоматически?