获取Java类加载引用层次结构

6
在调试使用Spring驱动的AspectJ LTW时(使用-verbose:class),我注意到在Spring建立与AspectJ weaver之间的连接之前,要被切入的类之一已经被类加载器加载了。
考虑到Java会推迟类的加载直到无法再延迟为止,那么这个特定的类为什么会如此早地被加载呢?
是否有可能在特定的时刻获取导致类加载的"引用堆栈"(以便我可以尝试推迟其使用)?如果可以,我该如何做呢?

你检查一下你的类路径可能会是个好主意,因为它可能包含该类并在Spring有机会进行通知之前被加载。 - Shailendra
1个回答

2
正如您已经注意到的那样,Java(或者实际上是运行您的代码的虚拟机)会在需要时加载和解析类。这通常也会对几个类产生连锁反应。显然,不包含编织代码的类有很高的机会在Spring类之前被加载。
但是,在启动时可以以多种方式配置Java HotSpot VM(安装Oracle Java时的典型VM) 。其中之一是“-XX:+ TraceClassLoading”(请注意加号;上述链接不幸地记录了此选项的减号)。还有另一个选项,按引用顺序跟踪已加载的类。
有了这个,您应该能够缩小问题范围。如果没有,请提供一些示例代码。尽管我担心那可能会有点太大。

1
“-” 表示禁用选项,“+” 表示启用选项,它们显示在那里是因为它们是默认值。 - Jacopofar
你说得没错,但是你有多少次只是复制/粘贴选项,然后想知道为什么它没有任何效果?这种情况经常发生在我身上。 :-) - Seelenvirtuose
谢谢您的建议,但是那个修饰符只会给我与-verbose:class相同的输出,即在加载类时打印。 这对于识别线性和简单的类依赖关系很有用(通过查看先前加载的类),但对于复杂的依赖关系则不太有用。 - andresp
Spring还有一个仪表代理,可以编织方面。在JVM调用的参数中放置“-javaagent:path/to/spring-instrument.jar”。或者您已经在使用了吗?如果您只是使用Spring的普通AOP功能,则无法正常工作。Spring AOP是基于代理的。 - Seelenvirtuose
我已经在使用Spring的instrument。我所说的是Spring驱动的AspectJ LTW与纯AspectJ LTW,而不是Spring AOP与AspectJ。 - andresp
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接