Выгрузить статические поля - PullRequest
10 голосов
/ 19 ноября 2011

У меня есть класс Java, который использует сложные статические поля, которые требуют специальных операций как close(), чтобы они были безопасно очищены с помощью GC.

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

Есть ли способ выгрузить статическое поле, аналогичнов блок статической инициализации?

Ответы [ 5 ]

8 голосов
/ 19 ноября 2011

Нет способа сделать то, что вы просите, потому что статический блок инициализируется, когда класс загружается, а finalize () работает только с объектами.

Попробуйте заменить статические переменные и сложную операцию в них классом Singleton и его экземпляром.

Таким образом, вы можете использовать finalize() метод для выполнения ваших close() действий.

3 голосов
/ 22 ноября 2013
private static Uninit cleanup = new Uninit();
....
private static class Uninit { 
    public Uninit() {} 

    public void finalize() {

                     //whatever you need done

    }
}
2 голосов
/ 19 ноября 2011

В веб-приложении вы должны использовать ServletContextListener .

1 голос
/ 19 ноября 2011

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

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

0 голосов
/ 19 ноября 2011

Нет.

Статические классы загружаются во время выполнения при первом его использовании и выгружаются только при выходе из программы (afaik).

Таким образом, вы можете создать статический метод close в самом классе, которыйочищает статические элементы и вызывает их при выходе.

...