Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / phantom reference vs weak reference / 25 сообщений из 48, страница 1 из 2
29.12.2016, 12:58
    #39377575
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
Прочитал n-ое количество топиков на эту тему, но видимо моего чувства английского не достаточно, чтобы уловить эту тонкую разницу.

На данный момент понятно, что
- PhantomReference слабее, чем WeakReference
-Судя по всему разница как-то завязана на исполнение метода finalize и помещении в очередь ReferenceQueue.

Также замечено, что у WeakReference и SoftReference есть 2 конструктора: с очередью и без очереди ReferenceQueue, что контрастирует с PhantomReference, который имеет единственный конструктор с очередью.

Разница phantom и weak в том, что в случае weak:
1.gc видит, что пора собрать объект
2.помещает ссылку на него в очередь
3.вызывает finalize
4.память, которую занимал объект высвобождается.

в случае phantom:
1.gc видит, что пора собрать объект
2.вызывает finalize
3.память, которую занимал объект высвобождается.
4.помещает ссылку на него в очередь

это происходит в несколько заходов gc(не понял почему, надеюсь это не так важно)
При этом зачем-то упоминается, что объект можно спасти если в finalize создать strong ссылку на объект.


Не очень понятно зачем эта очередь. всё что нарыл:

http://www.quizful.net/post/java_reference_types когда объект доступный с помощью ссылки удаляется, то сам объект ссылки становится доступным в очереди ReferenceQueue. Этот механизм позволяет удалять пустые ссылки.
это что для случаев когда вообще нужно когда каждый бит экономить?
Как пустую ссылку удалить вообще?
пустая ссылка эта та, что в null ведь ведет?
Сам факт передачи аргумента ReferenceQueue заставит gc почистить память, которую занимает ссылка или это просто инструмент для нас отслеживать жизненный цикл объекта/ссылки?

P.S. понимаю, что это поток мыслей, но яснее выразить вопросы не получается
...
Рейтинг: 0 / 0
29.12.2016, 13:15
    #39377603
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
Для начала я предлагаю разделить вопросы. PhantomReference вообще отдельная тема. На сколько я помню, его нельзя использовать без ReferenceQueue. А предназначен он для очискти нативных ресурсов. Хорошие примеры использования можно поискать в исходниках JDK. Кажется, с помощью него чистят нативную память под VolatileImage. То есть это более эффективная замена finalize.

WeakReference и SoftReference более похожи. У них просто разное поведение, но схожее использование.
...
Рейтинг: 0 / 0
29.12.2016, 13:20
    #39377609
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
questioner http://www.quizful.net/post/java_reference_types когда объект доступный с помощью ссылки удаляется, то сам объект ссылки становится доступным в очереди ReferenceQueue. Этот механизм позволяет удалять пустые ссылки.

Насколько я понимаю коммент к ReferenceQueue, то в эту очередь объект попадает, когда GC обнаружил, что объект может быть удалён, а не когда он удаляется.
Например, если этот объект- список, то может имеет смысл чистить списки в этой очереди- элементы из списка могут быть собраны раньше.
...
Рейтинг: 0 / 0
29.12.2016, 13:39
    #39377638
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
BlazkowiczWeakReference и SoftReference более похожи. У них просто разное поведение, но схожее использование.

Тут то всё предельно понятно. Везде одинаково пишут, что объекты на которые ссылаются SoftReference вероятно будут удалены только при нехватке памяти, WeakReference - тогда, когда будет удобно gc.


BlazkowiczНа сколько я помню, его нельзя использовать без ReferenceQueue
я об этом писал.
meзамечено, что у WeakReference и SoftReference есть 2 конструктора: с очередью и без очереди ReferenceQueue, что контрастирует с PhantomReference, который имеет единственный конструктор с очередью.

непонятно зачем эта очередь вообще нужна.

Alexey Tomin Насколько я понимаю коммент к ReferenceQueue, то в эту очередь объект попадает, когда GC обнаружил, что объект может быть удалён, а не когда он удаляется.

для soft/weak да, для phantom судя по всему нет. Ну во всяком случае в соответсвии с тем, что я вычитал

Alexey Tomin Например, если этот объект- список, то может имеет смысл чистить списки в этой очереди- элементы из списка могут быть собраны раньше.
не понял примера

BlazkowiczТо есть это более эффективная замена finalize.

Тут у нас речь идёт про phantom ссылки, получается это пост-finalize такой?
в чем большая эффективность?
...
Рейтинг: 0 / 0
29.12.2016, 13:39
    #39377641
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
finalize же всё равно будет вызван
...
Рейтинг: 0 / 0
29.12.2016, 13:55
    #39377660
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
questionerfinalize же всё равно будет вызван
Просто поищи в гугле. Статей на эту тему 100500. Одна из основных причин - finalize тормозной.
...
Рейтинг: 0 / 0
29.12.2016, 14:08
    #39377674
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
Blazkowiczquestionerfinalize же всё равно будет вызван
Просто поищи в гугле. Статей на эту тему 100500. Одна из основных причин - finalize тормозной.

Ок. Наверное понял. Это наша задача использовать либо finalize либо использовать фантомные ссылки.

Пока самое неясное это предназначение ReferenceQueue. Для фантомных ссылок эта очередь имеет особое значение судя по всему
...
Рейтинг: 0 / 0
29.12.2016, 14:17
    #39377678
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
questionerДля фантомных ссылок эта очередь имеет особое значение судя по всему

Вычистить данные из native-памяти, к примеру.
...
Рейтинг: 0 / 0
29.12.2016, 14:26
    #39377685
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
Alexey TominquestionerДля фантомных ссылок эта очередь имеет особое значение судя по всему

Вычистить данные из native-памяти, к примеру.

она ж null возвращает всегда для фантомных ссылок
...
Рейтинг: 0 / 0
29.12.2016, 14:29
    #39377690
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
зачем вообще очередь? чтобы передавать её в несколько конструкторов?
...
Рейтинг: 0 / 0
29.12.2016, 14:53
    #39377715
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
questionerзачем вообще очередь? чтобы передавать её в несколько конструкторов?

http://samolisov.blogspot.com.by/2011/09/phantomreferences-java.html

Я наверное понял что вас смущает. Ваш вопрос сводится к тому - зачем нужна очередь, если теоретически можно добавить метод isCollected в тот же PhantomReference. Ответ состоит в том, что поток выполняющий ваш код и поток сборки мусора это два разных потока, которые могут увидеть одну и ту же переменную в разном состоянии(data race), а так как очистка объекта это не атомарное действие(надо вызвать как finalise так и физически очистить память от байтов и тд), то использовать PhantomReference опасно, так как finalise уже отработал а память физически не удалилась и тд. Поэтому вводится третий объект очередь, который правильно синхронизирован, и если метод poll вернул что-то - значит все действия по очистке ГАРАНТИРОВАННО завершились - и вы можете приступать к кастомной очистке, как-то так.
...
Рейтинг: 0 / 0
29.12.2016, 17:22
    #39377850
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
забыл никquestionerзачем вообще очередь? чтобы передавать её в несколько конструкторов?

http://samolisov.blogspot.com.by/2011/09/phantomreferences-java.html

Я наверное понял что вас смущает. Ваш вопрос сводится к тому - зачем нужна очередь, если теоретически можно добавить метод isCollected в тот же PhantomReference. Ответ состоит в том, что поток выполняющий ваш код и поток сборки мусора это два разных потока, которые могут увидеть одну и ту же переменную в разном состоянии(data race), а так как очистка объекта это не атомарное действие(надо вызвать как finalise так и физически очистить память от байтов и тд), то использовать PhantomReference опасно, так как finalise уже отработал а память физически не удалилась и тд. Поэтому вводится третий объект очередь, который правильно синхронизирован, и если метод poll вернул что-то - значит все действия по очистке ГАРАНТИРОВАННО завершились - и вы можете приступать к кастомной очистке, как-то так.

Об этом я не думал пока, но спасибо, буду знать.

Меня не то, чтобы что-то смущало, я понять хочу))


Вот написал я такой код скажем:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public class Main {

    public static void main(String[] args) throws InterruptedException {
        ReferenceQueue<Bar> objectReferenceQueue = new ReferenceQueue<>();
        PhantomReference<Bar> phantomReference = new PhantomReference<Bar>(new Bar(), objectReferenceQueue);
        while (true){
            System.out.println(objectReferenceQueue.poll());
            System.out.println(phantomReference.get());
            Thread.sleep(500);
        }
    }
}

class Bar {
    int counter = 0;

    @Override
    public void finalize() throws Throwable {
        System.out.println("finalize");
        super.finalize();
    }
}



он выводит
null
null
null
null
....


Зачем так сложно писать null ?
...
Рейтинг: 0 / 0
29.12.2016, 17:28
    #39377859
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
questionerЗачем так сложно писать null ?
System.gc(); добавь. В цикл, например.
...
Рейтинг: 0 / 0
29.12.2016, 18:01
    #39377892
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
BlazkowiczquestionerЗачем так сложно писать null ?
System.gc(); добавь. В цикл, например.

Да, поведение изменилось.

Код: 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.
public class Main {

    public static void main(String[] args) throws InterruptedException {
        ReferenceQueue<Bar> objectReferenceQueue = new ReferenceQueue<>();
        PhantomReference<Bar> phantomReference = new PhantomReference<Bar>(new Bar(), objectReferenceQueue);
        while (true) {
            Reference<? extends Bar> reference = objectReferenceQueue.poll();
            System.out.println("poll(): " + reference);
            if (reference != null) {
                System.out.println("poll().get(): " + reference.get());
                return;
            }

            System.gc();
            Thread.sleep(500);
        }
    }
}

class Bar {
    int counter = 777;

    @Override
    public void finalize() throws Throwable {
        System.out.println("finalize");
        super.finalize();
    }
}



теперь вывод:

авторpoll(): null
finalize
poll(): null
poll(): java.lang.ref.PhantomReference@14ae5a5
poll
().get(): null

хотя в дебаггере в поле referent я вижу объект Bar:

...
Рейтинг: 0 / 0
29.12.2016, 18:07
    #39377898
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
questionerхотя в дебаггере в поле referent я вижу объект Bar:

Это вопрос или констатация факта?
http://stackoverflow.com/questions/7048767/why-are-phantom-references-not-cleared-as-they-are-enqueued
...
Рейтинг: 0 / 0
29.12.2016, 18:18
    #39377905
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
BlazkowiczЭто вопрос или констатация факта?


Это констатация непонимания факта, с надеждой на получение объяснения.
...
Рейтинг: 0 / 0
29.12.2016, 18:22
    #39377908
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
Blazkowicz,


авторPhantom references are not cleared when enqueued
вот я не понимаю, что понимается под cleared и под enqueued?

enqueued это попадание в ту самую ReferenceQueue ?
...
Рейтинг: 0 / 0
29.12.2016, 18:44
    #39377921
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
questioner,

Да, enqueue - это постановка в ReferenceQueue, а cleared, вероятно, фактическое удаление объекта из кучи.
...
Рейтинг: 0 / 0
29.12.2016, 18:50
    #39377924
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
Blazkowicz,

Получается для weak и soft попадание в очередь это фактически очистка из кучи, а для phantom это событие, когда можно явно очистить из кучи вызовом какого то метода?
...
Рейтинг: 0 / 0
30.12.2016, 10:14
    #39378157
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
questionerBlazkowicz,

Получается для weak и soft попадание в очередь это фактически очистка из кучи, а для phantom это событие, когда можно явно очистить из кучи вызовом какого то метода?



Если weak/soft ссылка оказалась в referenceQueue значит память объекта, на который она указывала уже освобождена коллектором?

а для фантомной ссылки, я , судя по поведению кода, ошибся. сначала вызывается finalize, потом попадаем в очередь и теперь мы имеем право высвободить память под объект, на который указывает ссылка. Если мы делаем reference.clear(), то память высвобождается. Если не делаем, то gc сам это сделает, когда эта ссылка будет не нужна.

это верно?
...
Рейтинг: 0 / 0
30.12.2016, 10:16
    #39378158
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
Blazkowiczquestionerхотя в дебаггере в поле referent я вижу объект Bar:

Это вопрос или констатация факта?
http://stackoverflow.com/questions/7048767/why-are-phantom-references-not-cleared-as-they-are-enqueued

ааа, понял кажется.

в ReferenceQueue ведь тоже хранится фантомная ссылка, а её get() всегда null возвращает
...
Рейтинг: 0 / 0
30.12.2016, 10:45
    #39378170
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
Blazkowicz,

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

Для фантомных ссылок сама ссылка полученная как

Код: java
1.
PhantomReference<Bar> phantomReference = new PhantomReference<Bar>(new Bar(), objectReferenceQueue);



уже не имеет никакого смысла. get всё равно вернет null.

когда в очереди
авторobjectReferenceQueue
появилось значение, то значит gc готов почистить объект из памяти и что finalize он уже вызвал.
Наша задача вызвать
Код: java
1.
objectReferenceQueue.poll().clear() 

для освобождения памяти.

в случае weak/soft references попадание в очередь сигнализирует о том, что объект уже выгружен из памяти. На ссылке из очереди никакого метода не вызвать, чтобы получить какую-либо информацию об умершем объекте. Важен сам факт попадания в очередь.
...
Рейтинг: 0 / 0
30.12.2016, 10:48
    #39378173
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
ещё получается, что если мы явно вызвали clear то значит мы знаем, что память будет освобождена. сразу после этого вызывается finalize если он не был до этого вызван и чистится память. ни в какую очередь ничего не попадает
...
Рейтинг: 0 / 0
30.12.2016, 11:48
    #39378212
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
questionerуже не имеет никакого смысла. get всё равно вернет null.

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

В этом-то и смысл и разница с finilize. В finilize ты получаешь ссылку на объект и он может легко утечь обратно в живые объекты. А PhantomReference у тебя нет ссылки на объект. И он уже не утечен. Но ссылку на ресурс надо хранить отдельно.
...
Рейтинг: 0 / 0
30.12.2016, 11:49
    #39378214
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
phantom reference vs weak reference
questionerещё получается, что если мы явно вызвали clear то значит мы знаем, что память будет освобождена. сразу после этого вызывается finalize если он не был до этого вызван и чистится память. ни в какую очередь ничего не попадает
Забудь про finalize. Зачем ты его вплетаешь в вопросы про PhantomReference? Это совсем иной deprecated механизм.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / phantom reference vs weak reference / 25 сообщений из 48, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]