Предыстория: Итак, у меня была отличная идея, верно? Иногда вы собираете огромное количество данных, и вам не нужно обращаться ко всем им все время, но они также могут вам не понадобиться после завершения программы, и вы действительно не хотите возиться с ними. таблицы базы данных и т. д. Что, если бы у вас была библиотека, которая молча и автоматически сериализовала бы объекты на диск, когда вы их не используете, и автоматически возвращала бы их обратно, когда они вам нужны? Итак, я начал писать библиотеку; у него есть несколько коллекций, таких как «DiskList» или «DiskMap», куда вы помещаете свои объекты. Они хранят ваши объекты через WeakReferences. Пока вы все еще используете данный объект, он имеет сильные ссылки на него, поэтому он остается в памяти. Когда вы прекращаете его использовать, объект удаляется сборщиком мусора, и непосредственно перед этим коллекция сериализует его на диск (*). Когда вам снова нужен объект, вы запрашиваете его по индексу или ключу, как обычно, и коллекция десериализует его (или возвращает из своего внутреннего кеша, если он еще не был GCd).
(*) Смотрите, это камень преткновения. Чтобы это работало, мне нужно иметь возможность получать уведомления НЕПОСРЕДСТВЕННО ДО того, как объект будет GCd - после того, как на него не существует других ссылок (и, следовательно, объект больше не может быть изменен), но до того, как объект будет стерт из памяти. Это оказывается трудно. Я ненадолго подумал, что использование ReferenceQueue спасет меня, но, увы, он возвращает ссылку, референт которой до сих пор всегда был нулевым.
Есть ли способ, получив произвольный объект, получить (через обратный вызов, очередь и т. д.) объект после того, как он будет готов к сборке мусора, но до того, как он станет сборщиком мусора?
Я знаю, что (Object).finalize()
в принципе может это сделать, но мне придется иметь дело с классами, которые мне не принадлежат, и чьи finalize
методы я не могу законно переопределить. Я бы предпочел не заморачиваться такими заумными загрузчиками классов, манипулированием байт-кодом или отражением, но сделаю это, если придется.
(Кроме того, если вы знаете о существующих библиотеках, выполняющих прозрачное кэширование диска, я бы отнесся к этому благосклонно, хотя мои требования к такой библиотеке были бы довольно строгими.)