Java: выяснение * почему * класс загружен - PullRequest
10 голосов
/ 08 января 2010

У меня сейчас проблема в том, что у меня есть (частичная) программа, которая пытается загрузить класс, но не может, потому что не может найти этот класс. Глядя на трассировку стека, я не вижу никакой конкретной причины для , почему виртуальная машина пытается загрузить этот конкретный класс с самого начала. Существуют ли какие-либо инструменты, которые позволили бы мне понять, почему загружается определенный класс?

Подсказка: Я уже получаю трассировку стека в тот момент, когда JVM пытается загрузить класс (через агента). Однако трассировка стека не содержит номеров строк. Поэтому я знаю только, какой метод запускает загружаемый класс, а не какой оператор. Тогда даже знания заявления может быть недостаточно. Один оператор может вызвать загрузку класса разными способами, потому что иногда виртуальной машине требуется загрузить часть транзитивного закрытия классов.

Ответы [ 3 ]

21 голосов
/ 08 января 2010

Запустите вашу программу с флагами -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 для определенного класса. Или, более вероятно, вы увидите ошибку, когда ваша программа попытается загрузить класс, после чего появятся сообщения разрешения для класса, который его загружает).

5 голосов
/ 08 января 2010

Вы можете попробовать инструмент статического анализа, такой как JDepend, чтобы увидеть, какие классы имеют ссылки на этот класс.

0 голосов
/ 08 января 2010

* загрузчиков классов 1002 *

Если в игре присутствует несколько загрузчиков классов (например, веб-приложение), вам следует быть осторожным. Пожалуйста, расскажите нам, что это за приложение.

Ресурс

Скажите нам, где находятся файлы jar (структура файла / каталога) и какой класс загружается. Вы загружаете это динамически, используя Class.forName? или используя пружину или другой каркас МОК? Это основной класс?

Некоторые предыдущие испытания (чтобы помочь нам)

Может быть, вы можете протестировать некоторые вещи, используя Class.getResource () из метода main. Если вы используете класс foo.bar.Clazz, попробуйте Class.getResource ("/ foo / bar / Clazz.class"), чтобы увидеть, вернет ли он что-то верное или нет. Попробуйте сделать то же самое с классом, который загружает ваш класс-неудачник, чтобы увидеть, где вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...