кто меня знает?(Хроника объекта) - PullRequest
2 голосов
/ 26 июня 2010

Если объект имеет 5 ссылок, может ли этот объект выяснить, что на него ссылаются?Потому что я знаю, что у Java (и, надеюсь, C#) есть список этого для GC.

Ответы [ 2 ]

8 голосов
/ 26 июня 2010

Нет, «списка литературы» нет. GC не должен знать все, что ссылается на объект - ему просто нужно знать, ссылается ли что-либо на объект.

В качестве очень грубой модели того, что делает GC, он помечает каждый объект в куче как мусор, а затем смотрит на объекты, которые он знает как не-мусорные («корневые» объекты). Например, он будет смотреть на стек каждого потока и для каждого метода экземпляра в потоке обычно 1 помечает целевой экземпляр как не содержащий мусора.

Затем он пройдет через каждый из этих корней и увидит, к каким объектам относятся эти , и пометит их как не-мусор. Он отступит, найдя все, что может. Все, что не было помечено как не-мусор, может быть собрано (или завершено).

Как вы можете видеть из этого алгоритма, GC не нужно хранить полный список ссылок для каждого объекта - просто немного сказать "мусор" или "не мусор".

Очевидно, что в действительности GC намного сложнее, как в Java, так и в .NET, с поколенными сборщиками мусора и различными стратегиями для минимизации "паузы" GC и использования нескольких потоков для GC. Надеюсь, этого упрощенного представления достаточно, чтобы объяснить, почему даже в GC нет списка ссылок.


1 Не всегда, в случае .NET. Объект можно собирать мусором, пока метод экземпляра все еще выполняется "в" нем, если этот метод не ссылается на какие-либо поля в объекте с текущей точки и далее.

0 голосов
/ 26 июня 2010

Если вам не удается найти языковую поддержку для этого, просто попросите каждый объект, который хочет сохранить ссылку на рассматриваемый объект, вызвать метод, который сообщает объекту, на который он ссылается.Этот объект затем добавит ссылающийся объект в список.Всякий раз, когда вы отказываетесь от ссылки на этот объект, вы вызываете другой метод, который удалит реферер из списка.

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