Выгружать статические поля

У меня есть класс 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 в самом классе, который очищает статические члены и вызывает его при выходе.