如何跟踪类在jvm中加载和销毁的情况?jvm是否公开了任何回调方法?
如果您使用的是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 ...]
您可以将命令行选项-verbose:class
添加到Java进程中,这将显示有关加载的每个类的信息。
您可以添加Java Opts来查看哪个类是通过加载的
java -verbose:class
关于被毁的班级,我不确定。
从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
来获取有关该选项的更多信息。
如果可以使用JRockit JVM,您可以使用下面的API,当加载类和卸载类时,这些API将为您提供回调方法
看看JVM类,我们应该从中使用getClassLibrary()
方法
在classLibrary对象上,我们可以为类加载事件注册监听器,该事件提供类名等。
您可以使用静态块来检测类加载,但不能检测类卸载。在java中,通过系统类加载器加载的所有类永远不会被卸载,并且只有在类加载器被卸载时,通过其他类加载器装载的所有类才会被卸载。
static{
//execute when the class will be loaded
}
您是想在应用程序中获得这些信息,还是只想从外部分析这些信息?在后一种情况下,您可能可以使用VisualVM来实现这一点。也许您的问题与以下问题有关:VisualVM中已加载的类。
您可以在静态构造函数中跟踪类的创建。就我而言,你无法追踪它的破坏。只有当gc收集用于加载类的类加载器时,才卸载类
您可能也有兴趣阅读以下内容:关于StackOverflow 的类加载器的另一个问题