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