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

标签 java jvm

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

提示: 我已经在 J​​VM 尝试加载类(通过代理)的确切位置获得堆栈跟踪。但是,堆栈跟踪不包含行号。因此我只知道哪个方法触发了正在加载的类,而不是哪个语句。那么,即使知道声明可能还不够。单个语句可能导致类以多种方式加载,因为有时 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/

相关文章:

Java:Producer = Consumer,如何知道什么时候停止?

java - java CMS gc 日志中的 'real' 、 'user' 和 'sys' 是什么意思?

java - Spring应用程序的应用部署机制类型

java - `-jvm-debug 5005` 在 JVM 中到底改变了什么?

linux - 如何从另一个 TC Agent 复制现有 JVM,并创建专用 Java 安装来运行本地代理

java.lang.VerifyError : (class: GregorSamsa, method : . ..) 跳转或分支的非法目标

java - 将 EntityManager 与数据库同步

java - 在一台计算机上出现 "UnreachableBrowserException/Address already in use"的 Selenium 中断

java - 使用 JTable 显示 Arraylist 的值

java - cellEditor 中的 commandLink 不会触发 action/actionListener