почему большинство JVM gcs не используют refcounts? - PullRequest
9 голосов
/ 03 февраля 2011

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

Ответы [ 2 ]

13 голосов
/ 03 февраля 2011

Подсчет ссылок подвержен утечкам памяти из-за циклических ссылок. Представьте, что у вас есть простой объект "узел", который имеет ссылку на другой узел, и предположим, что вы устанавливаете его ссылку на себя. Счетчик ссылок для этого объекта всегда будет равен 1, даже если для него нет дескриптора из глобальной переменной или переменной стека, поэтому он никогда не будет собирать мусор и будет пропускать память. Это тривиальный пример, но любая циклическая ссылка будет иметь ту же проблему.

Конечно, циклические ссылки могут быть обнаружены, но, по-видимому, это приводит к дополнительным сложностям, что делает другие методы GC более привлекательными.

4 голосов
/ 03 февраля 2011

  1. Подсчет ссылок должен выполняться вне объекта.
  2. Подсчет ссылок идет медленно. Еще медленнее иметь дело с циклическими ссылками, но это не невозможно. Все еще медленно.
  3. Подсчет ссылок на самом деле очень медленный, так как он должен использовать цикл CAS +
  4. Несчетное число ссылок легче реализовать и быстрее, особенно с некоторыми хитростями страницы памяти ОС.
  5. Подсчет ссылок может быть полностью удален с помощью escape-анализа, если объект не сбежал.
...