Java:找出加载类的*原因*

Java:找出加载类的*原因*,java,jvm,Java,Jvm,我目前的问题是,我有一个(部分)程序正在尝试加载一个类,但失败了,因为它找不到这个类。查看堆栈跟踪,我看不出VM首先尝试加载这个特定类的任何特定原因。有没有什么工具可以让我弄清楚为什么要加载某个特定的类 提示: 我已经在JVM尝试加载类的确切位置(通过代理)获得了堆栈跟踪。但是,堆栈跟踪不包含行号。因此,我只知道哪个方法触发正在加载的类,而不知道哪个语句。那么,即使知道这句话也可能不够。单个语句可以以多种方式加载类,因为有时VM需要加载类的传递闭包的一部分。您可以尝试使用JDepend之类的静态

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

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

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

类加载器

如果游戏中有多个类加载器(如web应用程序),那么应该小心。请告诉我们什么是应用程序

资源

告诉我们JAR(您的文件/dir结构)在哪里,加载的是什么类。您是否使用Class.forName以友好方式加载它?还是使用spring或IOC的其他框架?是主课吗

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


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

使用
-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

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

我不熟悉Java,但是提供该类的模拟,并在其中查看调用堆栈如何?如果这在Java中是可能的话。也许你可以在这里发布堆栈跟踪,因为有人可能会帮助你使用它。这可能是验证器的一个副作用(参见Java谜题)。但是需要更多的信息。我已经做了,但是依赖性是相当微妙的。加载类时当前正在执行的方法中没有提到加载的类。它必须类似于当前方法中某个类型的某个字段类型的某个超类的某个接收类的某个超类。。。你明白我的意思了,我已经在JVM试图加载类的地方(通过代理)得到了堆栈跟踪。但是,堆栈跟踪不包含行号。因此,我只知道哪个方法触发要加载的类,而不知道哪个语句。我的目的是查看引发有问题的类加载的类是在预期的类加载程序(比如说jar)上还是在另一个上。当然,如果您有多个类装入器…:(结果正是我所需要的!成就了我的一天!非常感谢!也正是我所需要的。但请注意,像我这样不受注意的人:如果你盲目地选择和复制参数“-XX:+TraceClassLoading and-XX:+TraceClassResolution,请确保你不复制“and”"当你用这个的时候,我真不敢相信我花了多长时间才弄明白那个飞行员的错误。结果我真的需要一个变体--XX:-TraceClassLoadingPreorder@James-有趣。我一直在查看该字段的描述,并试图找出引用的订单与加载的订单之间的差异。是因为JVM将l缓存和聚合加载(我可以在多线程应用程序中看到这种情况)?@kdgregory,我也有同样的怀疑。我只是尝试了这个标志,它给出了一个有用的答案。(有了这个标志,最近的加载实际上是问题所在,没有它,我看到一些来自java的类。*空间不是问题所在。)如果类加载器认为它可以通过这种方式获得更好的性能,它是否会触发另一个线程上的其他加载?这在我要调查的事情列表中,但不幸的是,它不是非常接近顶部。在我的例子中,我从scala-library.jar引入了一些东西,所以它也可能是scala中的一些东西。