我目前遇到的问题是我有一个(部分)程序试图加载一个类,但失败了,因为它找不到这个类。查看堆栈跟踪,我看不出任何特别的原因来解释 为什么 VM 首先尝试加载这个特定的类。是否有任何工具可以让我弄清楚加载特定类的原因?
提示: 我已经在 JVM 尝试加载类(通过代理)的确切位置获得堆栈跟踪。但是,堆栈跟踪不包含行号。因此我只知道哪个方法触发了正在加载的类,而不是哪个语句。那么,即使知道声明可能还不够。单个语句可能导致类以多种方式加载,因为有时 VM 需要加载部分类的传递闭包。
最佳答案
使用 -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 消息链。或者更有可能的是,当您的程序尝试加载类时,您会看到一个错误,之前是加载它的类的解析消息。
关于Java:找出*为什么*一个类被加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2029070/