Трябва ли да поддържам силна препратка към WeakReference, която се използва само за извършване на финализиране?

Бих искал да използвам WeakReference като по-ефективен метод finalize() за целите на освобождаване на естествени ресурси, свързани с обект, веднага щом стане възможно да се направи това, без да се използва финализиране (което има значително по-високи разходи от използването на Слаба референция).

Тъй като това е единствената цел на WeakReference (никога няма да използвам WeakReference за получаване на реферирания обект), изглежда разточително да отделям време и място за поддържане на списък с моите WeakReferences, за да предотвратя събирането им на боклук.

Но ако е конструиран нормален обект и към него не се поддържа силна препратка, той просто ще бъде освободен от събирача на отпадъци и не мога да намеря нищо в Javadoc, което предполага, че това е различно за WeakReference.

Необходимо ли е да се поддържа препратка към WeakReference, за да се предотврати събирането му на боклук, или, ако трябва да бъде поставен в ReferenceQueue, това ще го поддържа жив, докато не бъде събран от опашката?


person Theodore Murdock    schedule 20.08.2015    source източник
comment
Бих искал да използвам WeakReference като по-ефективен метод finalize() Чакай, как?   -  person Sotirios Delimanolis    schedule 20.08.2015
comment
@SotiriosDelimanolis Това включва нишка, посветена на почистването на вашия псевдо-финализатор WeakReferences и запазване на собствените ресурси не в псевдо-финализируемия клас, а вместо това в обекта WeakReference. Псевдофинализируемият клас поддържа препратка към WeakReference, която съдържа собствените му ресурси. Когато се установи, че псевдофинализируемият клас е само слабо рефериран, WeakReference се поставя в опашката ReferenceQueue, която сте посочили при конструирането на WeakReference. Вашата нишка за почистване взема от ReferenceQueue и подканва вашата WeakReference да извърши почистване.   -  person Theodore Murdock    schedule 20.08.2015
comment
Не е по-евтино от гледна точка на времето за разработка, но може да бъде от гледна точка на производителността, ако глобалното заключване, използвано при преброяване на финализируеми обекти, се превърне в пречка и може да помогне, ако JVM стане особено мързелива при събирането на вашите финализиращи обекти, което води до прекомерно задържане на паметта.   -  person Theodore Murdock    schedule 20.08.2015
comment
Все още не разбирам. Вашата опашка ще съдържа само препратка към обекта WeakReference. Как можете да почистите оригиналната опакована цел?   -  person Sotirios Delimanolis    schedule 20.08.2015
comment
Въпросът няма смисъл. Ако нямате силна референция към слабата референция, вие също нямате слаба референция. Или питате между силна референция и слаба референция слабата референция?   -  person user207421    schedule 21.08.2015
comment
@EJP Не, чувствам се като такава загуба на време да правя и поддържам силна препратка, която използвам само като флаг за предотвратяване на събирането на боклук, така че се чудя дали наистина е необходимо.   -  person Theodore Murdock    schedule 21.08.2015
comment
@SotiriosDelimanolis Вие съхранявате информацията, необходима за почистване на вашите собствени данни, връзки към бази данни и т.н. във вашия подтип на WeakReference, така че да не се нуждаете от нищо друго освен от самия обект WeakReference, за да извършите почистването. Ако тези данни се променят по време на жизнения цикъл на вашия реален обект, тогава истинският обект, който потребителите използват, се превръща в нещо като прокси, съхранявайки собствените си данни чрез друг обект, който се оказва WeakReference за себе си. Когато реалният обект стане недостъпен, WeakReference с ресурсите, които трябва да бъдат освободени, се добавя към опашката, която сте посочили.   -  person Theodore Murdock    schedule 21.08.2015


Отговори (1)


Необходимо ли е да се поддържа препратка към WeakReference, за да се предотврати събирането му на боклук

Разгледайте java.lang.ref описание на пакета, той посвещава цял абзац на отговора на вашия въпрос:

Връзката между регистриран референтен обект и неговата опашка е едностранна. Това означава, че опашката не следи препратките, които са регистрирани с нея. Ако регистрирана препратка сама по себе си стане недостъпна, тя никога няма да бъде поставена в опашка. Отговорност на програмата, използваща референтни обекти, е да гарантира, че обектите остават достъпни, докато програмата се интересува от техните референти.

person the8472    schedule 20.08.2015