如何在jvm中加载和销毁类时跟踪?是否有任何由jvm公开的回调方法?
答案 0 :(得分:24)
如果您使用的是Sun / Oracle JVM,则可以使用TraceClassLoading
和TraceClassUnloading
选项。使用以下命令查看JVM支持的选项:
java -XX:+AggressiveOpts -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+PrintFlagsFinal -version
如果支持这些选项,请使用-XX:+TraceClassLoading -XX:+TraceClassUnloading
运行Java应用程序。您应该看到以下消息:
[Loaded ... from ...]
[Unloading class ...]
答案 1 :(得分:8)
您可以将command line option -verbose:class
添加到Java进程中
显示有关每个类加载的信息。
答案 2 :(得分:6)
您可以添加Java Opts以查看通过以下方式加载的类:
java -verbose:class
关于被摧毁的课程,我不确定。
答案 3 :(得分:2)
如果可以使用JRockit JVM,则可以使用下面的API,这将在加载类并卸载类时为您提供回调方法。
看看我们应该使用getClassLibrary()
方法的JVM课程
在classLibrary对象上,我们可以为类加载事件注册监听器,这些事件给出了类名等。
答案 4 :(得分:1)
您可以使用静态块来检测类加载,但无法检测类卸载。 在java中,通过系统类加载器加载的所有类都将永远不会被卸载,并且只有在卸载类加载器时才会卸载通过其他类加载器加载的所有类。
static{
//execute when the class will be loaded
}
答案 5 :(得分:0)
您是否希望在您的应用程序中使用此信息,或者您只想从外部进行分析?在后一种情况下,您可以使用VisualVM。也许您的问题与此问题有关:Loaded classes in VisualVM。
答案 6 :(得分:0)
您可以在静态构造函数中跟踪类的创建。就我而言,你无法追踪它的破坏。只有当gc收集用于加载类的类加载器时,才会卸载类 您可能也有兴趣阅读此内容:another question on classloaders at StackOverflow
答案 7 :(得分:0)
从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
来获取有关该选项的更多信息。