Выгружать статические поля
У меня есть класс java, который использует сложные статические поля, которым нужны специальные операции как close()
, чтобы они были безопасно очищены GC.
Для инициализации статических полей я использую блок static
. Но теперь я не могу безопасно выгрузить статическое поле, чтобы я мог вызвать метод close()
до того, как поле будет очищено GC.
Есть ли способ выгрузить статическое поле, похожее на статический блок инициализации?
Ответы
Ответ 1
Нет способа сделать то, что вы просите, потому что статический блок инициализируется, когда класс загружается и завершается() работает только с объектами.
Рассмотрите возможность замены ваших статических переменных и сложной операции в ней с помощью класса Singleton и экземпляра его.
Таким образом, вы можете использовать метод finalize()
для выполнения действий close()
.
Ответ 2
private static Uninit cleanup = new Uninit();
....
private static class Uninit {
public Uninit() {}
public void finalize() {
//whatever you need done
}
}
Ответ 3
В веб-приложении вы должны использовать ServletContextListener.
Ответ 4
Вы можете настроить shutdown hook, чтобы выполнить это, но вы не сможете выполнить все действия. Возможно, у вас закончилась нехватка памяти или процесс, возможно, был убит без возможности дать возможность очистки и т.д.
Лучше либо убедиться, что ваша консистенция данных не зависит от этого кода и/или переместить его на код, который регулярно очищается в течение всего срока службы приложения.
Ответ 5
Нет.
Статические классы загружаются во время выполнения при первом использовании и выгружаются только тогда, когда программа выходит (afaik).
Итак, вы можете сделать статический метод close
в самом классе, который очищает статические члены и вызывает его при выходе.