java - 如何查找 JVM 尝试加载的类的列表和顺序(而不是已经加载的类)

标签 java jvm

我正在尝试调试以下问题:Sun JVM 尝试加载我调用的静态方法未使用的类,并导致 NoClassDefFoundError。详情如下:

方法 A.x() 调用 B.getTZ_OFFSET() 并且它甚至在 OraclePreparedStatement 之前就遇到了 NoClassDefFoundError控件到达getTZ_OFFSET。我查看了 B 中的所有静态变量和 block ,没有一个引用 OraclePreparedStatement 或与之密切相关的任何内容。我假设仅导入该类不会导致该类被加载。

如何根据哪个 JVM 尝试加载 OraclePreparedStatement 找出依赖关系?

开关-verbose:class仅给出已成功加载的类的列表,而不是JVM尝试加载的类的列表。有没有办法获取该信息?

任何帮助将不胜感激。

我知道导入 ojdbc.jar 会导致问题消失,但我对根本原因更感兴趣,比如为什么它首先尝试加载它。

最佳答案

您的 JVM 找不到的类可能在许多地方被引用:您调用的方法的参数列表、返回类型、您正在使用的类的类(静态)成员、任何父类(super class)的类成员以及静态初始化器。您必须检查所有这些地方才能找到隐藏的引用。 NoClassDefFoundError 还可能掩盖您收到的其他一些错误,例如创建并引用不存在的类的异常对象。

确定类加载顺序的一种方法是实现您自己的类加载器。您只需要扩展类 ClassLoader 并重写方法 loadClass(String, boolean),即可打印到标准输出所请求的类的名称,然后委托(delegate)给 super.loadClass(String, boolean)。

关于java - 如何查找 JVM 尝试加载的类的列表和顺序(而不是已经加载的类),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11228228/

相关文章:

java - 如何显示Java ArrayList的内容?

java - 未检测到本地 JVM,甚至未检测到运行此 java 任务控制实例的 jvm

java - Apache Tomcat JVM Heapsize on Redhat 5 64 位 32 RAM 2 四核 Xeon 性能问题

java - InvokeDynamic 参数的动态类型

python - 调试 SIGSEGV Java 运行时 fatal error (Python 上的 PySpark)

java - GCP 下载/获取服务帐户 key

java - Spring 依赖冲突 - 遗留代码

java - Kotlin:扩展动态给定的父类(super class)型

java - 为什么这个简单的代码会抛出 NullPointerException?

jvm - 任意 JVM 行为