Подтвердить что ты не робот

Как отслеживать, когда класс загружен и уничтожен в jvm?

Как мне отслеживать, когда класс загружен и уничтожен в jvm? Есть ли какой-либо метод обратного вызова, который отображается jvm?

4b9b3361

Ответ 1

Если вы используете JVM Sun/Oracle, вы можете использовать опции TraceClassLoading и TraceClassUnloading. Используйте следующие возможности, чтобы узнать, какие опции поддерживает JVM:

java -XX:+AggressiveOpts -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+PrintFlagsFinal -version

Если эти параметры поддерживаются, запустите приложение Java с помощью -XX:+TraceClassLoading -XX:+TraceClassUnloading. Вы должны увидеть такие сообщения, как:

[Loaded ... from ...]
[Unloading class ...]

Ответ 2

Вы можете добавить параметр командной строки -verbose:class в ваш Java-процесс, это будет отображать информацию о каждом загруженном классе.

Ответ 3

Вы можете добавить Java Opts, чтобы узнать, какой класс загружен через:

java -verbose:class

Об уничтоженном классе, я не уверен.

Ответ 4

Если все в порядке с использованием JRockit JVM, вы можете использовать приведенные ниже API, что даст вам методы обратного вызова при загрузке класса и класс выгружается.
Посмотрите на JVM класс, из которого мы должны использовать метод getClassLibrary().
На объекте classLibrary мы можем регистрировать слушателей для событий загрузки классов, которые дают имена классов и т.д.

Ответ 5

Вы можете использовать статический блок для определения загрузки классов, но вы не можете обнаружить разгрузку классов. В java все классы, загружаемые через системный загрузчик классов, никогда не будут выгружены, а все классы, загруженные через другие загрузчики классов, будут выгружены только при загрузке загрузчика классов.

static{ 

        //execute when the class will be loaded

    }

Ответ 6

Вы хотите эту информацию в своем приложении или просто хотите проанализировать это извне? В последнем случае вы можете использовать VisualVM для этого. Возможно, ваш вопрос связан с этим: Загруженные классы в VisualVM.

Ответ 7

Вы можете отслеживать создание класса в статическом конструкторе. И вы не можете отследить его разрушение, насколько мне известно. Классы только выгружаются, когда gc собирает загрузчик классов, который использовался для загрузки классов.
Вам также может быть интересно прочитать следующее: fooobar.com/questions/41728/...

Ответ 8

Начиная с Java 9, вы можете использовать -Xlog. например:

java -Xlog:class+load -Xlog:class+unload ...

Это напечатает записи как:

[0.296s][info][class,load] java.lang.Shutdown source: jrt:/java.base
[0.296s][info][class,load] java.lang.Shutdown$Lock source: jrt:/java.base

Вы также можете использовать -Xlog:help чтобы получить больше информации о опции.