Когда слабые ссылки должны использоваться?

Этот метод хорошо работал:

var textArea = document.getElementById("textAreaId");
var arrayFromTextArea = textArea.value.split(String.fromCharCode(10));
17
задан peter.murray.rust 29 October 2009 в 00:16
поделиться

3 ответа

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

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

Пример: если у меня есть куча объектов Foo в моем приложении, я могу использовать Set, чтобы вести центральную запись всех Foo, которые у меня есть. . Но когда другие части моего приложения удаляют объект Foo, удаляя все ссылки на него, я не Я не хочу, чтобы оставшаяся ссылка, которую мой Set хранит на этот объект, не позволяла ему быть собранным в мусор! На самом деле я просто хочу, чтобы он исчез из моего набора. Здесь вы можете использовать что-то вроде Weak Set (в Java есть WeakHashMap), который использует слабые ссылки на свои элементы вместо «сильных» ссылок.

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

d используйте вместо этого что-то вроде Weak Set (в Java есть WeakHashMap), который использует слабые ссылки на свои элементы вместо «сильных» ссылок.

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

d используйте вместо этого что-то вроде Weak Set (в Java есть WeakHashMap), который использует слабые ссылки на свои элементы вместо «сильных» ссылок.

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

s по-прежнему содержит ссылку, которую вы забыли удалить. Использование слабых ссылок может облегчить боль, связанную с ведением бухгалтерского учета, поскольку вам не нужно беспокоиться о том, что они сохранят объект «живым» и не собирающим мусор, но у вас нет для их использования .

s по-прежнему содержит ссылку, которую вы забыли удалить. Использование слабых ссылок может облегчить боль, связанную с ведением бухгалтерского учета, поскольку вам не нужно беспокоиться о том, что они сохранят объект «живым» и не собирающим мусор, но у вас нет для их использования .

22
ответ дан 30 November 2019 в 10:53
поделиться

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

Небольшой пример: событие таймера, которое обновляет некоторые данные. Любое количество объектов может подписаться на таймере, чтобы получать уведомления, но тот факт, что они подписались на таймере, не должен поддерживать их жизнь. Таким образом, таймер должен иметь слабые ссылки на объекты.

16
ответ дан 30 November 2019 в 10:53
поделиться

Можно ли нанести любой урон чрезмерное энтузиазм в использовании WR?

Да, может.

Одна проблема заключается в том, что слабые ссылки делают ваш код более сложным и потенциально подверженным ошибкам. Любой код, который использует слабую ссылку, должен иметь дело с возможностью того, что ссылка была сломана каждый раз, когда он ее использует. Если вы чрезмерно используете слабые ссылки, вы в конечном итоге напишете много лишнего кода. (Вы можете смягчить это, скрывая каждую слабую ссылку за методом, который заботится о проверке и повторно создает отброшенный объект по запросу. Но это не обязательно может быть так просто; например, если процесс воссоздания включает в себя сеть доступа, вам необходимо справиться с возможностью сбоя повторного создания.)

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

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

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

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

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

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

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

Если эта стоимость высока (с точки зрения процессорного времени, пропускной способности ввода-вывода, сетевого трафика и т. Д.), Ваше приложение может в результате работать плохо. Возможно, вам лучше выделить JVM больше памяти и вообще не использовать слабые ссылки.

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

Если эта стоимость высока (с точки зрения процессорного времени, пропускной способности ввода-вывода, сетевого трафика и т. Д.), Ваше приложение может в результате работать плохо. Возможно, вам лучше выделить JVM больше памяти и вообще не использовать слабые ссылки.

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

8
ответ дан 30 November 2019 в 10:53
поделиться