Java:找出*为什么*加载一个类

use*_*237 10 java jvm

我目前遇到的问题是我有一个(部分)程序试图加载一个类但失败,因为它找不到这个类.查看堆栈跟踪,我看不出任何特定原因导致 VM首先尝试加载此特定类.是否有任何工具可以让我弄清楚为什么要加载特定的类?

提示:我已经在JVM尝试加载类(通过代理)的确切位置获取堆栈跟踪.但是,堆栈跟踪不包含行号.因此我只知道哪个方法触发了正在加载的类,而不是哪个语句.然后,即使知道该陈述可能还不够.单个语句可以导致以多种方式加载类,因为有时VM需要加载类的传递闭包的一部分.

kdg*_*ory 21

使用-XX:+TraceClassLoading-XX:+TraceClassResolution标志运行程序.这将创建大量输出,如下所示:

[Loaded com.kdgregory.example.memory.PermgenExhaustion$MyClassLoader from file:/home/kgregory/Workspace/Website/programming/examples/bin/]
RESOLVE com.kdgregory.example.memory.PermgenExhaustion$MyClassLoader java.net.URLClassLoader
RESOLVE java.net.URLClassLoader java.lang.Class URLClassLoader.java:188
Run Code Online (Sandbox Code Playgroud)

您需要跟踪特定类的RESOLVE消息链.或者更有可能的是,当程序尝试加载类时,您会看到错误,前面是加载它的类的解析消息.


Jef*_*rey 5

您可以尝试使用JDepend之类的静态分析工具来查看哪些类具有对该类的引用.