|
|
|
Как работает WeakHashMap 'under the hood'
|
|||
|---|---|---|---|
|
#18+
Как мне было известно до чтения исходников(везде так пишут) WeakHashMap это пары состоящие из 1. weak ссылка на ключ и 2. Значение судя по коду при вставке элемента в мапу мы делаем что-то типа Код: java 1. где queue это ReferenceQueue. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. так же я заметил, что ещё одним важным методом, который используется является метод expungeStaleEntries. Как я понял он вызывается на каждую операцию. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. Тут я начинаю немного плыть. С одной стороны Entry имеет weak ссылку на ключ, strong ссылку на значение. С другой стороны вся Entry это weak ссылка. Что будет если weak ссылка имеет внутри strong ссылку. Не знаю почему, но логика подсказывает, что всё таки ключ может быть собран GC, а значение придётся чистить самому(судя по методу expungeStaleEntries) Дальше идёт сильное непонимание происходящего. Насколько я понимаюю weak ссылки(видимо как-то не так я это делаю) в очередь ссылка попадает уже когда объект на который она указывала уже того(память из под него освобождена) В нашем случае мы складывали в очередь только key, а достаём (Entry<K,V>) x. Разъясните, пожалуйста, непонимание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2017, 12:15 |
|
||
|
Как работает WeakHashMap 'under the hood'
|
|||
|---|---|---|---|
|
#18+
questionerС одной стороны Entry имеет weak ссылку на ключ, strong ссылку на значение. С другой стороны вся Entry это weak ссылка. Что будет если weak ссылка имеет внутри strong ссылку.Такие структуры данных (как WeakHashMap) используются при промежуточной обработке. Допустим, у нас есть набор объектов, которые мы хотим представить в виде хэш-мэпа (напр., формирование дерева). Но объекты-значения будут использоваться в последующей обработки. Самое главное - мы не теряем данные, даже если произойдет GC. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2017, 12:39 |
|
||
|
Как работает WeakHashMap 'under the hood'
|
|||
|---|---|---|---|
|
#18+
Usman, вопрос не про использование, а про внутреннее устройство. Вот как GC понимает, что нужно положить в queue именно Entry, а не WeakReference. Мы же вызываем просто super(key, queue); , что есть конструктор WeakReference ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2017, 13:43 |
|
||
|
Как работает WeakHashMap 'under the hood'
|
|||
|---|---|---|---|
|
#18+
questionerС одной стороны Entry имеет weak ссылку на ключ, strong ссылку на значение. С другой стороны вся Entry это weak ссылка. Что будет если weak ссылка имеет внутри strong ссылку. Где слабо там и рвется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 10:43 |
|
||
|
Как работает WeakHashMap 'under the hood'
|
|||
|---|---|---|---|
|
#18+
questionerДальше идёт сильное непонимание происходящего. Насколько я понимаюю weak ссылки(видимо как-то не так я это делаю) в очередь ссылка попадает уже когда объект на который она указывала уже того(память из под него освобождена) В нашем случае мы складывали в очередь только key, а достаём (Entry<K,V>) x. Где это? Код: java 1. 2. 3. 4. Вроде бы сам Reference, т.е. в данном случае его наследник Entry<K,V> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 11:01 |
|
||
|
Как работает WeakHashMap 'under the hood'
|
|||
|---|---|---|---|
|
#18+
questionerС одной стороны Entry имеет weak ссылку на ключ, strong ссылку на значение.Strong-ссылки идут извнеquestionerС другой стороны вся Entry это weak ссылка.Да Код: java 1. questionerЧто будет если weak ссылка имеет внутри strong ссылку.Со strong-ссылкой ничего не случится. Пострадает только weak-объект. При желании можно заWRAPать значение перед вставкой: m.put(key, new WeakReference (value)) questionerНе знаю почему, но логика подсказывает, что всё таки ключ может быть собран GC, а значение придётся чистить самому(судя по методу expungeStaleEntries)Не сам ключ, а вся запись Entry<K,V> (т.к. extends WeakReference<Object> ).questionerВ нашем случае мы складывали в очередь только keyв ReferenceQueue?questionerа достаём (Entry<K,V>) xТак работают все Map'ы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 11:56 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39394491&tid=2123200]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
58ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 193ms |
| total: | 342ms |

| 0 / 0 |
