我知道通过使用标志verbose:class,我们可以让jvm在加载类时从哪里注销。但是,我想看到一些额外的信息 - 哪个类加载器加载了类,理想情况下正在执行的类导致了加载。 (不完全确定后一部分甚至有意义!)
有没有办法让jvm记录这个信息,或者有关如何获取它的任何其他建议?感谢
答案 0 :(得分:1)
如果您使用-XX:+TraceClassLoading
和-XX:+TraceClassResolution
,您可以看到触发类加载的内容,您将看到Loading
个消息的集合(当.class字节获取时)当类本身得到解决时,加载)和后续的RESOLVE
消息。因此,通过确定您看到的RESOLVE
条消息,您应该能够确定哪个类导致依赖类被加载。
不幸的是,这并没有告诉你关于你的类加载器的任何信息。因此,虽然它会打印出它加载的JAR,如果它没有唯一标识您的类加载器,那么可能无法使用标准工具回答问题。但是,如果您使用提供自己的类加载器的嵌入式引擎(如Tomcat或OSGi),则可以打开其他调试标志,以便识别正在使用的类加载器实例。
答案 1 :(得分:0)
如果您的问题是在调试类加载,我会考虑使用调试器。
使用intellij我能够在url-classloader中设置断点。 您可以配置此断点以记录自定义消息而不是中断。
如果您希望能够在制作中启用此功能,您当然可以编写自己的类加载器。
这并不困难,但您必须弄清楚如何在不记录加载框架加载的情况下登录日志框架。我想最简单的方法是在记录时忽略一些预定义的包。 如果您选择此路线,我可能会为您提供解决方案的外壳。 请问。