![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| ElectricalStorm |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 547 Регистрация: 22.1.2004 Репутация: 5 Всего: 9 |
обьясните пожалуйста что такое WeakReference, SoftReference и как ими пользоваться и нужно ли вообще ?
-------------------- Нужно знать инструмент, которым пользуешься |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
Если в двух словах, то выглядит это следующим образом:
Как известно JAVA имеет сборщик мусора, который убирает те объекты, на которые ссылки нигде не присутствуют. Если же где-то на такой объект ссылка есть, то этот объект не уничтожается. Бывает ситуация, когда памяти уже не хватает и надо ее явным образом освободить - фактически присвоить ссылкам NULL. И это надо делать ручками. А потом этот объект надо снова восстанавливать. Что крайне неудобно. Reference - это нечто вроде обертки, через которую можно обратится к созданному объекту. И как раз такого рода объекты сборщик при нехватке памяти уничтожает. А когда программа пробует получить ссылку на объект через reference, она получает в ответ NULL и должна заново создать объект. Т.е. программист заявляя, что объект "обернут" reference, говорит следующее: "Если не хватит памяти, то этот объект можно уничтожить. А я напишу специальный код, который будет проверять этот объект на NULL и если что, создавать объект заново". Таким образом система берет на себя хотя бы половину работы - автоматически уничтожает объекты - ей надо только сказать, какие можно. Восстанавливать надо самому. Но это все же лучше, чем все ручками. |
|||
|
||||
| ElectricalStorm |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 547 Регистрация: 22.1.2004 Репутация: 5 Всего: 9 |
это Вы про какие про SoftReference или про WeakReference ?
-------------------- Нужно знать инструмент, которым пользуешься |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
Вообще-то существует три типа:
SoftReference - "сборщик" может удалить этот объект, а может и не удалить. Это зависит от "сборщика". WeakReference - "сборщик" всегда удаляет такой объект. PhantomReference - "сборщик" помещает такой объект в очередь на удаление. И если программа подтверждает, что удалять можно, объект удаляется. |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
От себя добавлю, что в текущей реализации JVM от Sun (1.4.2) SoftReference, удалять или не удалять данную ссылку принимает на основе времени последнего доступа.
Я поставил эксперимент ограничив память для JVM, я в цикле начал создавать большое количество объектов: при использовании WeakReference нехватки памяти никогда не возникало, а при использовании SoftReference я довольно быстро получи OutOfMemoryError -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| ElectricalStorm |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 547 Регистрация: 22.1.2004 Репутация: 5 Всего: 9 |
а в каких случаях стоит использовать WeakReference ?
-------------------- Нужно знать инструмент, которым пользуешься |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
Эта ссылка будет уничтожаться при первом же запуске "сборщика". SoftReference, как уже упоминал LSD, не всегда так хорошо себя ведет. |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Есть такой класс WeakHashMap который использует для хранения объектов WeakReference, Sun рекомендует использовать его для кеширования объектов. Еще можешь посмотреть метод toString() у java.util.Date там есть пример использования SoftReference.
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |