【发布时间】:2012-03-29 07:42:08
【问题描述】:
当类在 jvm 中加载和销毁时如何跟踪? jvm有没有暴露的回调方法?
【问题讨论】:
-
您在这里提出了两个问题。你到底想学什么,或者想完成什么?弄清楚这一点后,请接受对您最有帮助的答案。
当类在 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 ...]
【讨论】:
您可以将command line option -verbose:class 添加到您的Java 进程中,这将
显示加载的每个类的信息。
【讨论】:
您可以添加 Java Opts 以查看通过以下方式加载的类:
java -verbose:class
关于被破坏的班级,我不确定。
【讨论】:
如果可以使用JRockit JVM,您可以使用下面的API,它会在加载和卸载类时为您提供回调方法。
看看我们应该使用 getClassLibrary() 方法的 JVM 类。
在 classLibrary 对象上,我们可以为提供类名等的类加载事件注册侦听器。
【讨论】:
您可以使用静态块来检测类加载,但不能检测类卸载。 在java中,所有通过系统类加载器加载的类永远不会被卸载,所有通过其他类加载器加载的类只有在类加载器被卸载时才会被卸载。
static{
//execute when the class will be loaded
}
【讨论】:
您希望在您的应用程序中获得这些信息,还是只想从外部分析这些信息?在后一种情况下,您也许可以使用VisualVM。也许您的问题与这个问题有关:Loaded classes in VisualVM。
【讨论】:
您可以在静态构造函数中跟踪类的创建。就我而言,你无法追踪它的破坏。只有当 gc 收集用于加载类的类加载器时,类才会被卸载。
您可能也有兴趣阅读以下内容:another question on classloaders at StackOverflow
【讨论】:
从 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 获取有关该选项的更多信息。
【讨论】: