Подтвердить что ты не робот

Как известно слабая карта хеш-мусора - собирать объект?

Недавно я узнал о структуре данных WeakHashMap в Java.

Однако я не понимаю, что это означает, что это мусор - собирает сопоставление, когда оно больше не используется обычным способом. Как узнает структура данных, я больше не буду использовать ключ в своей программе? Что делать, если я долго не ссылаюсь на ключ?

4b9b3361

Ответ 1

Однако я не понимаю, что это означает, что это мусор - собирает сопоставление, когда оно больше не используется обычным способом.

OK. При нормальных обстоятельствах, когда запускает сборщик мусора, он удаляет объекты, которые ваша программа больше не может использовать. Технический термин - это "недостижимый объект", а это означает, что выполнение программы больше не имеет возможности получить ссылку на объект. Объект, недоступный, может быть собран в следующем цикле GC... или нет. В любом случае, это больше не касается приложения.

В этом случае WeakHashMap использует специальный класс WeakReference для обозначения ключей. Слабая ссылка - это объект, который действует как косвенный указатель (указатель на объект, содержащий указатель). Он обладает интересным свойством, что сборщик мусора может разорвать ссылку; т.е. заменить ссылку, содержащуюся в null. И правило заключается в том, что слабая ссылка на объект будет нарушена, когда GC замечает, что объект больше не доступен через цепочку нормальных (сильных) или мягких ссылок 1.

Фраза "больше не в обычном использовании" на самом деле означает, что ключевой объект больше не может быть сильно или мягко доступен; т.е. через цепочку сильных и/или мягких ссылок.

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

WeakHashMap этого не делает. Скорее, это GC, который замечает, что ключ не является достижимым.

Как часть обычного обхода, GC найдет и отметит все сильно достижимые объекты. Затем он проходит через все объекты WeakReference и проверяет, объекты, на которые они ссылаются, были отмечены, и разбивает их, если они этого не сделали. (Или что-то в этом роде... Я никогда не смотрел фактическую реализацию GC, и это осложняется тем, что он должен иметь дело с объектами SoftReference и PhantomReference.)

Единственное участие, которое имеет WeakHashMap, состоит в том, что:

  • он создал и использует WeakReference объекты для ключей, а
  • он выводит записи хэш-таблицы, чей ключ WeakReferences был очищен GC.

Что делать, если я долго не ссылаюсь на ключ?

Критерий принятия решения о том, что слабая ссылка должна быть нарушена, не основана на времени.

Но возможно, что время влияет на то, не удаляется ли ключ. Например, ключ мог бы 1) перестать быть сильной ссылкой, 2) извлекаться с карты и 3) присваиваться доступной переменной, заставляя ее сильно ссылаться еще раз. Если GC не запускается во время окна, в котором ключ не достигнут, ключ и связанное с ним значение останутся на карте. (Это то, что вы хотели бы сделать...)


1 - Мягкие ссылки - это своего рода ссылка, которую GC может нарушить, если есть нехватка памяти кучи.

Ответ 2

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

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

Надеюсь, это поможет!

Ответ 3

Мусор JVM собирается в следующем порядке:

  • Объекты без ссылок
  • Объекты, единственной ссылкой которых является WeakReference
  • Объекты, единственная ссылка которых SoftReference

Обычно сборщик мусора собирает только ненужные объекты.

Слабая ссылка на объект не считается ссылкой на сборщик мусора. Сборщик мусора может или не может их собирать. Как правило, он не будет собирать их, если память не работает, но нет никаких гарантий.

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

Из javadoc SoftReference:

Все мягкие ссылки на объекты с мягким достижением гарантированно будут очищены до того, как виртуальная машина вытащит OutOfMemoryError

Ответ 4

Я прочитал ваш вопрос, задав конкретную формулировку "регулярное использование", и поэтому предположим, что вы уже знаете о сильных и слабых ссылках. Регулярное использование относится к случаю, когда слабый хэш файл содержит ключи, на которые также ссылаются (сильно) некоторые другие структуры данных. Существование хотя бы одной сильной ссылки на ключ - это "регулярное использование". Ключ нельзя собирать мусор, если эта другая структура данных ссылается на него. Когда другая структура данных больше недоступна (указатели на нее больше не существуют), ключ также становится недоступным. Он больше не используется в обычном режиме, поскольку единственная ссылка на него - слабая в отображении. Сборщик мусора может в конечном итоге вернуть его, и отображение исчезает.

Это происходит, если вы хотите расширить тип C путем подкласса, но не можете: например, когда C является интерфейсом со многими реализациями. Вы можете обойти эту проблему, используя слабый хэш файл с типом ключа C и новыми полями, которые будут добавлены в новый класс E. Всякий раз, когда вы создаете экземпляр C, вы также создаете экземпляр E и добавляете пару к карте, что затем используется для доступа к новым полям в течение жизни C intance. Когда экземпляр C становится мусором, также отображаются сопоставление и экземпляр E. Это автоматически, потому что хэш-карта слаба. Если бы это было не так, его нужно было бы очистить вручную так же, как вы должны явно освободить хранилище на языках без сборщика мусора.