Сделайте обратный вызов на объекте Java только ДО того, как он соберет мусор - PullRequest
0 голосов
/ 26 октября 2018

Предыстория: Значит, у меня была отличная идея, верно? Иногда вы собираете огромное количество данных, и вам не нужно все время получать к ним доступ, но вам может и не понадобиться это после завершения программы, и вы действительно не хотите разбираться с таблицы базы данных и т. д. Что если бы у вас была библиотека, которая бы автоматически и автоматически сериализировала объекты на диск, когда вы их не используете, и молча возвращала их обратно, когда они вам нужны? Итак, я начал писать библиотеку; у него есть несколько коллекций, таких как «DiskList» или «DiskMap», в которые вы помещаете свои объекты. Они хранят ваши объекты через WeakReferences. Пока вы все еще используете данный объект, он имеет сильные ссылки на него, поэтому он остается в памяти. Когда вы прекращаете его использовать, объект собирается сборщиком мусора, и перед тем, как это произойдет, коллекция сериализует его на диск (*). Когда вам снова нужен объект, вы запрашиваете его по индексу или ключу, как обычно, и коллекция десериализует его (или возвращает его из своего внутреннего кэша, если он еще не был GCd).

(*) Видите ли, это точка преткновения. Чтобы это работало, мне нужно иметь возможность получать уведомления ТОЛЬКО ДО того, как объект GCd - после того, как другие ссылки на него не существуют (и, следовательно, объект больше не может быть изменен), но до того, как объект будет удален из памяти. Это сложно. Я кратко подумал, что использование ReferenceQueue спасет меня, но, увы, он возвращает ссылку, чей референт до сих пор всегда был нулевым.

Есть ли способ, получив произвольный объект, получить (через обратный вызов или очередь и т. Д.) Объект после того, как он будет готов к сборке мусора, но до того, как он станет мусором?

Я знаю, (Object).finalize() в принципе может это сделать, но мне придется иметь дело с классами, которые мне не принадлежат, и чьи finalize методы я не могу законно переопределить. Я бы предпочел не идти таким тайным, как пользовательские загрузчики классов, манипуляции с байт-кодом или рефлексия, но я сделаю это, если придется.

(Кроме того, если вы знаете о существующих библиотеках, которые выполняют прозрачное кеширование дисков, я бы оценил это положительно, хотя мои требования к такой библиотеке были бы довольно строгими.)

1 Ответ

0 голосов
/ 26 октября 2018

Вы можете найти кеш, поддерживающий «запись за кэшированием» и многоуровневое. Известные продукты будут EHCache, Hazelcast, Infinispan.

Или вы можете создать что-то самостоятельно с кешем и временем простоя. Тогда доступ к кешу будет «использованием» объекта.

Есть ли способ, получив произвольный объект, получить (через обратный вызов или очередь и т. Д.) Объект после того, как он будет готов к сборке мусора, но до того, как он станет мусором?

Это сильно мешает уборке мусора. Высоки шансы, что это сломает ваше приложение или всю систему. Что вы хотите сделать, это запустить дисковый ввод-вывод и потенциально выделить дополнительные объекты, когда в системе мало или не хватает памяти. Если вам удастся заставить его работать, вы в конечном итоге будете использовать больше кучи, чем раньше, так как куча всегда должна быть расширена при запуске GC.

...