2013-05-02 3 views
0

Я пытаюсь избавиться от утечек памяти. Я бы хотел сбросить все статические переменные всех классов (не только мои) из загрузчика классов. Существует атрибут classes, в котором перечислены все классы, известные ClassLoader.Как узнать, была ли запущена инициализация статического блока?

Так что я просто хочу перевернуть его и с отражением установить статические переменные в null.

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

Итак, вопрос: есть ли способ узнать, есть ли ВОО был запущен JVM или нет.


Примечание:

никому предлагающего использовать findLoadedClass в ClassLoader, есть в описании это важное предложение: * В этом посте есть важное замечание: «загружены» Безразлично» t означает «инициализировано». инициализация происходит только в точных моментах, определенных JLS3 $ 12.4.1 *

+1

http://stackoverflow.com/questions/3678579/how-to-check-whether-a-class-is-initialized Я думаю, что это, что ты поиск – LionC

+0

Как вы знаете, что статические блоки являются причиной связей с памятью? Вы много профилировали? Если вы точно не знаете причину, неплохо попытаться оптимизировать преждевременно. –

+0

@ LionC см. Редактирование моего сообщения – poussma

ответ

0

static блок был инициализирован, если класс был загружен на JVM.

Является ли класс загружен на JVM вы можете обнаружить с ClassLoader

+1

В этой статье есть важное замечание: *** «загруженный» не означает «инициализирован». инициализация происходит только в точных моментах, определенных JLS3 $ 12.4.1 *** – poussma

Смежные вопросы