Как уже указывали другие, GC точно знает, какие поля каждого блока в стеке и куче являются управляемыми ссылками, потому что GC и джиттер знают тип everything .
Однако ваша точка зрения хорошо принята.Представьте себе совершенно гипотетический мир, в котором в одном и том же процессе происходит два вида управления памятью .Например, предположим, что у вас есть полностью гипотетическая программа под названием «InterMothra Chro-Nagava-Sploranator», написанная на C ++, которая использует традиционное управление памятью с подсчетом ссылок в стиле COM, где все является просто указателем на память процесса, а объекты освобождаются путем вызоваМетод выпуска правильное количество раз.Предположим, что Sploranator гипотетически имеет язык сценариев JabbaScript, который поддерживает пул объектов, собираемых мусором.
Проблема возникает, когда объект JabbaScript имеет ссылку на неуправляемый объект Sploranator, а тот же объект Sploranator имеет ссылку назад.Это циклическая ссылка, которая не может быть нарушена сборщиком мусора JabbaScript, потому что она не знает о структуре памяти объекта Sploranator.Таким образом, здесь есть вероятность утечек памяти.
Один из способов решения этой проблемы - переписать диспетчер памяти Sploranator, чтобы он выделял свои объекты из управляемого пула GC.
Другой способ - использовать эвристику;GC может выделить поток процессора для сканирования всей памяти в поисках целых чисел, которые являются указателями на его объекты.Это звучит как много, но он может пропустить незафиксированные страницы, страницы в собственной управляемой куче, страницы, которые, как известно, содержат только код, и так далее.ГХ может сделать предположение, что если он думает, что объект может быть мертвым, и он не может найти указатель на этот объект в какой-либо памяти вне его контроля, то этот объект почти наверняка мертв.
Обратная сторонаэтой эвристики, конечно, что это может быть неправильно.У вас может быть целое число, которое случайно совпадает с указателем (хотя это менее вероятно в 64-битной области).Это продлит срок службы объекта.Но кого это волнует?Мы уже в ситуации, когда циклические ссылки могут продлить время жизни объектов.Мы пытаемся сделать эту ситуацию лучше , и эта эвристика делает это.То, что оно не идеально, не имеет значения;это лучше, чем ничего.
Другой способ ошибиться состоит в том, что Sploranator может иметь кодированный указатель, скажем, переворачивая все его биты при сохранении значения и только переворачивая еговернуться прямо перед звонком.Если Sploranator активно враждебен к этой эвристической стратегии GC, то это не сработает.
Сходство между изложенной здесь стратегией сбора мусора и реальной стратегией GC для любого продукта практически полностью совпадает.Рассуждения Эрика о деталях реализации сборщиков мусора из гипотетических несуществующих продуктов предназначены только для развлекательных целей.