2

我知道,通过使用标志 verbose:class,我们可以让 jvm 在加载类时以及从何处注销。但是,我想查看一些附加信息 - 哪个类加载器加载了该类,理想情况下是哪个正在执行的类导致加载。(不完全确定后半部分是否有意义!)

有什么方法可以让 jvm 记录此信息,或任何其他有关如何获取它的建议?谢谢

4

2 回答 2

2

如果您使用,您可以看到在某些情况下是什么触发了类加载,-XX:+TraceClassLoading并且-XX:+TraceClassResolution您将看到一组Loading消息(当加载 .class 字节时)以及RESOLVE当类本身被解析时的后续消息。因此,通过弄清楚RESOLVE您看到哪些消息,您应该能够确定哪个类导致加载依赖类。

不幸的是,这并没有告诉你任何关于你的类加载器的信息。因此,尽管它会打印出从中加载的 JAR,但如果它不能唯一标识您的类加载器,那么可能无法使用标准工具回答问题。但是,如果您使用提供自己的类加载器的嵌入式引擎(例如 Tomcat 或 OSGi),则可能会打开额外的调试标志,以便识别正在使用的类加载器实例。

于 2016-04-19T17:32:41.260 回答
1

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

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

如果您希望能够在生产中打开它,您当然可以编写自己的类加载器。

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

于 2016-05-04T11:24:13.460 回答