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

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

如果您使用的是Sun / Oracle JVM,则可以使用TraceClassLoadingTraceClassUnloading选项。 使用以下命令查看JVM支持的选项:

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

如果支持这些选项,请使用-XX:+TraceClassLoading -XX:+TraceClassUnloading运行Java应用程序-XX:+TraceClassLoading -XX:+TraceClassUnloading 。 您应该看到以下消息:

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

您可以将命令行选项 -verbose:class到Java进程,这将显示有关每个已加载类的信息。

您可以添加Java Opts以查看通过以下方式加载的类:

 java -verbose:class 

关于被摧毁的课程,我不确定。

如果可以使用JRockit JVM ,则可以使用下面的API,这将在加载类并卸载类时为您提供回调方法。
看看我们应该使用getClassLibrary()方法的JVM类。
在classLibrary对象上,我们可以为类加载事件注册监听器,这些事件给出了类名等。

您是否希望在您的应用程序中使用此信息,或者您只是想从外部分析这些信息? 在后一种情况下,您可以使用VisualVM 。 也许你的问题与这个问题有关: VisualVM中的已加载类 。

您可以在静态构造函数中跟踪类的创建。 就我而言,你无法追踪它的破坏。 只有在gc收集用于加载类的类加载器时才会卸载类。
您可能也有兴趣阅读此内容: StackOverflow上有关类加载器的另一个问题

您可以使用静态块来检测类加载,但无法检测类卸载。 在java中,通过系统类加载器加载的所有类都将永远不会被卸载,并且只有在卸载类加载器时才会卸载通过其他类加载器加载的所有类。

 static{ //execute when the class will be loaded }