Потому что тогда вам понадобятся проверки каждый раз, когда назначается / изменяется любая ссылка (элемент объекта, переменная, элемент коллекции и т. Д.).И вам нужно будет отслеживать все ссылки на объект, например, сохраняя счет и обновляя его.Это называется подсчетом ссылок и имеет множество проблем, от общей производительности (каждое назначение ссылок требует сравнений и доступа к памяти) до накладных расходов на синхронизацию при наличии параллелизма (что произойдет, если два потока будут смешивать ссылки на один и тот же объект одновременно?), Чтобыневозможность обнаружить циклы (если A относится к B, а B относится к A, ни один счетчик ссылок не может упасть до 0, поэтому вы теряете память или вам все еще нужен «полный» GC, как описано ниже).
Вместобольшинство сборщиков мусора просто позволяют ссылкам приходить и уходить, и если им нужно собирать, они следуют ссылкам, которые существуют в настоящее время, чтобы определить, какие объекты используются (соответственно, может использоваться, поскольку они достижимы)и освободить остальных.Очевидно, что это большая работа, поэтому вы делаете это только время от времени.Существует несколько более изощренных подходов, которые минимизируют объем работы в среднем или предпочитают собирать области кучи, которые более вероятны.Но общая проблема остается: вы не можете найти весь мусор, как только он станет мусором, поскольку это будет означать обход всей кучи каждый раз, когда меняется ссылка.