2016-04-15 61 views
0

我知道,通过使用flag verbose:class,我们可以让jvm在加载类时从何处注销。但是,我希望看到一些额外的信息 - 哪个类加载器加载了类,理想情况下是导致加载的正在执行的类。 (不完全确定,后者甚至是有道理的!)Java类加载 - 哪个类加载器和/或类导致加载?

有没有什么办法让jvm记录这些信息,或者其他任何有关如何得到它的建议?由于

回答

0

你可以看到什么触发在某些情况下的一类负荷,如果你使用-XX:+TraceClassLoading-XX:+TraceClassResolution你会看到Loading消息的集合(当的.class字节得到加载)和随后的RESOLVE消息时类本身得到解决。因此,通过计算出您看到的哪个RESOLVE消息应该能够确定导致从属类加载哪个类。

不幸的是,这并没有告诉你有关你的类加载器的任何信息。因此,虽然它会打印出加载的JAR,但如果它不能唯一标识类加载器,则可能无法使用标准工具回答问题。但是,如果您使用的是提供自己的类加载器的嵌入式引擎(如Tomcat或OSGi),则可能会有其他调试标志,您可以启用该标志以确定正在使用哪个类加载器实例。

0

如果你的问题是调试类加载,我会考虑使用调试器。

使用intellij我能够在url-classloader中设置一个断点。 您可以配置此断点来记录自定义消息而不是中断。

如果你想在生产中打开这个功能,你当然可以编写你自己的类加载器。

这并不困难,但您必须弄清楚如何在不记录加载框架的情况下登录到日志框架。我猜最简单的方法是在登录时忽略一些预定义的软件包。 如果你选择这条路线,我可以为你提供一个解决方案。 只是问。