Стоит ли использовать слабую (или мягкую и т. Д.) Ссылку в качестве родительской ссылки в дереве? - PullRequest
3 голосов
/ 06 февраля 2012

Для повышения эффективности ГХ - то есть, когда периодические циклы развертки ГХ становятся короче и / или реже для заданного размера кучи, платит ли родительское дочернее дерево за использование слабых ссылок на детей для ссылок на своих родителей, чтобы предотвратить ссылку ГХпетли?Или разница незначительна?

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

Ответы [ 3 ]

2 голосов
/ 06 февраля 2012

В Java нет проблем с циклами ссылок, поэтому, если это ваша единственная задача, нет, вам не нужно использовать слабые / мягкие ссылки для родительских ссылок.

0 голосов
/ 06 февраля 2012

Это зависит от того, как вы используете свое дерево.

Если вам не требуются родительские элементы дерева и вы не ссылаетесь на родителей из других частей вашего приложения, то может потребоваться использовать какую-то слабую ссылку от ребенка к родителю. Имейте в виду, что вы будете позволять своим родительским элементам произвольно собирать мусор. Кроме того, ваше дерево должно быть существенно большим, чтобы увидеть любую разницу в периодическом GC.

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

0 голосов
/ 06 февраля 2012

Я не эксперт по внутренним компонентам JVM, но, похоже, это еще хуже.Мягкие / слабые ссылки вступают в игру, когда объект не доступен через сильные ссылки.Исходящие ссылки не должны влиять на приемлемость объекта для сборки мусора.Ссылка на родителя является исходящей.Рассмотрим две ситуации:

  • Ребенок имеет право на сборку мусора, и предки также имеют право.Я ожидаю, что все дерево имеет право на сборку мусора.
  • Ребенок не имеет права на сборку мусора, и нет сильных связей с предками.Если предки достижимы только через слабые звенья, то они должны быть GCed.Может ли это повлиять на правильность работы программы?

Говоря о производительности, написание программ без GC дает гораздо большую предсказуемость, чем игра со слабыми ссылочными типами.Написание GC-free является предпочтительным способом решения проблемы со сборкой мусора (если это является причиной ваших проблем с производительностью)

Более подробную информацию вы можете найти, например, в Управление памятью в Java Hotspot VirtualМашина Белой бумаги.

...