Как мне отслеживать, когда класс загружен и уничтожен в jvm? Есть ли какой-либо метод обратного вызова, который отображается jvm?
Как отслеживать, когда класс загружен и уничтожен в jvm?
Ответ 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
чтобы получить больше информации о опции.