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

时间:2010-01-08 16:38:06

标签: java jvm

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

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

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:5)

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

答案 2 :(得分:0)

<强>类加载器

如果这是一个让游戏中有多个类加载器的环境(比如Web应用程序),那么你应该小心。请告诉我们这个应用程序是什么。

<强>资源

告诉我们jar(你的文件/目录结构)和正在加载的类的位置。你使用Class.forName以dinamically方式加载吗?或使用春天或国际奥委会的其他框架?它是主要类吗?

以前的一些测试(帮助我们)

也许你可以在main方法中使用Class.getResource()测试一些东西。如果你的类是foo.bar.Clazz,请尝试Class.getResource(“/ foo / bar / Clazz.class”)以查看它是否返回有效的内容。尝试对加载失败类的类执行相同的操作,以查看它是否在您期望的位置。

相关问题