Есть ли способ утилизации сложного объекта Java, когда GC решил, что он недоступен - PullRequest
3 голосов
/ 10 января 2012

В C ++ я использую объекты с подсчетом ссылок для реализации "автоматической" рециркуляции пула объектов

SmartPointer<ObjType> object = pool.getObject(); // hold reference

// ... do stuff with object over time.

object = nullptr; // that is when reference 
                  // count goes to 0

- Теперь у меня есть в объектах C ++ метод "onFinalRelease ()", который вызывается приколичество ссылок достигает 0. Я могу переопределить это (по умолчанию - delete (this)), чтобы автоматически перерабатывать объекты, а не уничтожать их.

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

SomeReference r = referenceQueue.getReference();

pool.recycle(r.takeBackUnusedObjectFromGC()); // ??????????????????????????

Это было бы очень приятно:)

Ответы [ 4 ]

7 голосов
/ 10 января 2012

Вы можете использовать PhantomReference s, чтобы сделать что-то подобное.Имейте интерфейсный (прокси) объект с (сильной, однонаправленной) ссылкой на дорогой объект.Также держите сильную ссылку на дорогой объект в вашем управлении пулом.Оставьте PhantomReference для объекта интерфейса.Как только PhantomReference появится на его ReferenceQueue, вы наверняка знаете, что дорогой объект не используется через интерфейсный объект (даже с учетом завершения).Теперь дорогой объект можно повторно использовать с новым интерфейсным объектом.

Однако, вероятно, оно того не стоит.

1 голос
/ 10 января 2012

При подсчете ссылок есть четко определенное время, когда объект становится мусором - когда счетчик ссылок становится равным нулю.С помощью сборки мусора в Java нет гарантии, что данный объект будет когда-либо подвергаться сборке мусора, даже если на него нет более сильных ссылок.

Реализация собственного счетчика ссылок вручнуюлучшее решение, которое я могу придумать.

0 голосов
/ 25 ноября 2015
0 голосов
/ 10 января 2012

В Java есть нечто похожее - метод finalize .К сожалению, когда он запускается для объекта, пути назад уже нет.Кроме того, запуск даже не гарантирован.

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

...