如何跟踪类何时在jvm中加载和销毁



如何跟踪类在jvm中加载和销毁的情况?jvm是否公开了任何回调方法?

如果您使用的是Sun/Oracle JVM,则可以使用TraceClassLoadingTraceClassUnloading选项。使用以下内容查看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 的类加载器的另一个问题

最新更新