Java class 加载 - 哪个 class 加载程序 and/or class 导致加载?

Java class loading - which class loader and/or class caused loading?

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

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

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

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

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

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

如果你想在生产中启用它,你当然可以编写自己的类加载器。

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